1*7931d332SJit Loon Lim /* 2*7931d332SJit Loon Lim * Copyright (c) 2019-2021, ARM Limited and Contributors. All rights reserved. 3*7931d332SJit Loon Lim * Copyright (c) 2019-2023, Intel Corporation. All rights reserved. 4*7931d332SJit Loon Lim * 5*7931d332SJit Loon Lim * SPDX-License-Identifier: BSD-3-Clause 6*7931d332SJit Loon Lim */ 7*7931d332SJit Loon Lim 8*7931d332SJit Loon Lim #include <assert.h> 9*7931d332SJit Loon Lim #include <arch.h> 10*7931d332SJit Loon Lim #include <arch_helpers.h> 11*7931d332SJit Loon Lim #include <common/bl_common.h> 12*7931d332SJit Loon Lim #include <common/debug.h> 13*7931d332SJit Loon Lim #include <common/desc_image_load.h> 14*7931d332SJit Loon Lim #include <drivers/cadence/cdns_sdmmc.h> 15*7931d332SJit Loon Lim #include <drivers/generic_delay_timer.h> 16*7931d332SJit Loon Lim #include <drivers/synopsys/dw_mmc.h> 17*7931d332SJit Loon Lim #include <drivers/ti/uart/uart_16550.h> 18*7931d332SJit Loon Lim #include <lib/mmio.h> 19*7931d332SJit Loon Lim #include <lib/xlat_tables/xlat_tables_v2.h> 20*7931d332SJit Loon Lim 21*7931d332SJit Loon Lim #include "agilex5_clock_manager.h" 22*7931d332SJit Loon Lim #include "agilex5_memory_controller.h" 23*7931d332SJit Loon Lim #include "agilex5_mmc.h" 24*7931d332SJit Loon Lim #include "agilex5_pinmux.h" 25*7931d332SJit Loon Lim #include "agilex5_system_manager.h" 26*7931d332SJit Loon Lim #include "ccu/ncore_ccu.h" 27*7931d332SJit Loon Lim #include "combophy/combophy.h" 28*7931d332SJit Loon Lim #include "nand/nand.h" 29*7931d332SJit Loon Lim #include "qspi/cadence_qspi.h" 30*7931d332SJit Loon Lim #include "sdmmc/sdmmc.h" 31*7931d332SJit Loon Lim #include "socfpga_emac.h" 32*7931d332SJit Loon Lim #include "socfpga_f2sdram_manager.h" 33*7931d332SJit Loon Lim #include "socfpga_handoff.h" 34*7931d332SJit Loon Lim #include "socfpga_mailbox.h" 35*7931d332SJit Loon Lim #include "socfpga_private.h" 36*7931d332SJit Loon Lim #include "socfpga_reset_manager.h" 37*7931d332SJit Loon Lim #include "wdt/watchdog.h" 38*7931d332SJit Loon Lim 39*7931d332SJit Loon Lim 40*7931d332SJit Loon Lim /* Declare mmc_info */ 41*7931d332SJit Loon Lim static struct mmc_device_info mmc_info; 42*7931d332SJit Loon Lim 43*7931d332SJit Loon Lim /* Declare cadence idmac descriptor */ 44*7931d332SJit Loon Lim extern struct cdns_idmac_desc cdns_desc[8] __aligned(32); 45*7931d332SJit Loon Lim 46*7931d332SJit Loon Lim const mmap_region_t agilex_plat_mmap[] = { 47*7931d332SJit Loon Lim MAP_REGION_FLAT(DRAM_BASE, DRAM_SIZE, 48*7931d332SJit Loon Lim MT_MEMORY | MT_RW | MT_NS), 49*7931d332SJit Loon Lim MAP_REGION_FLAT(PSS_BASE, PSS_SIZE, 50*7931d332SJit Loon Lim MT_DEVICE | MT_RW | MT_NS), 51*7931d332SJit Loon Lim MAP_REGION_FLAT(MPFE_BASE, MPFE_SIZE, 52*7931d332SJit Loon Lim MT_DEVICE | MT_RW | MT_SECURE), 53*7931d332SJit Loon Lim MAP_REGION_FLAT(OCRAM_BASE, OCRAM_SIZE, 54*7931d332SJit Loon Lim MT_NON_CACHEABLE | MT_RW | MT_SECURE), 55*7931d332SJit Loon Lim MAP_REGION_FLAT(CCU_BASE, CCU_SIZE, 56*7931d332SJit Loon Lim MT_DEVICE | MT_RW | MT_SECURE), 57*7931d332SJit Loon Lim MAP_REGION_FLAT(MEM64_BASE, MEM64_SIZE, 58*7931d332SJit Loon Lim MT_DEVICE | MT_RW | MT_NS), 59*7931d332SJit Loon Lim MAP_REGION_FLAT(GIC_BASE, GIC_SIZE, 60*7931d332SJit Loon Lim MT_DEVICE | MT_RW | MT_SECURE), 61*7931d332SJit Loon Lim {0}, 62*7931d332SJit Loon Lim }; 63*7931d332SJit Loon Lim 64*7931d332SJit Loon Lim boot_source_type boot_source = BOOT_SOURCE; 65*7931d332SJit Loon Lim 66*7931d332SJit Loon Lim void bl2_el3_early_platform_setup(u_register_t x0, u_register_t x1, 67*7931d332SJit Loon Lim u_register_t x2, u_register_t x4) 68*7931d332SJit Loon Lim { 69*7931d332SJit Loon Lim static console_t console; 70*7931d332SJit Loon Lim 71*7931d332SJit Loon Lim handoff reverse_handoff_ptr; 72*7931d332SJit Loon Lim 73*7931d332SJit Loon Lim generic_delay_timer_init(); 74*7931d332SJit Loon Lim config_clkmgr_handoff(&reverse_handoff_ptr); 75*7931d332SJit Loon Lim mailbox_init(); 76*7931d332SJit Loon Lim enable_nonsecure_access(); 77*7931d332SJit Loon Lim 78*7931d332SJit Loon Lim deassert_peripheral_reset(); 79*7931d332SJit Loon Lim if (combo_phy_init(&reverse_handoff_ptr) != 0) { 80*7931d332SJit Loon Lim ERROR("Combo Phy initialization failed\n"); 81*7931d332SJit Loon Lim } 82*7931d332SJit Loon Lim 83*7931d332SJit Loon Lim console_16550_register(PLAT_INTEL_UART_BASE, PLAT_UART_CLOCK, 84*7931d332SJit Loon Lim PLAT_BAUDRATE, &console); 85*7931d332SJit Loon Lim 86*7931d332SJit Loon Lim /* Store magic number */ 87*7931d332SJit Loon Lim mmio_write_32(L2_RESET_DONE_REG, PLAT_L2_RESET_REQ); 88*7931d332SJit Loon Lim } 89*7931d332SJit Loon Lim 90*7931d332SJit Loon Lim void bl2_el3_plat_arch_setup(void) 91*7931d332SJit Loon Lim { 92*7931d332SJit Loon Lim handoff reverse_handoff_ptr; 93*7931d332SJit Loon Lim 94*7931d332SJit Loon Lim struct cdns_sdmmc_params params = EMMC_INIT_PARAMS((uintptr_t) &cdns_desc, get_mmc_clk()); 95*7931d332SJit Loon Lim 96*7931d332SJit Loon Lim mmc_info.mmc_dev_type = MMC_DEVICE_TYPE; 97*7931d332SJit Loon Lim mmc_info.ocr_voltage = OCR_3_3_3_4 | OCR_3_2_3_3; 98*7931d332SJit Loon Lim 99*7931d332SJit Loon Lim /* Request ownership and direct access to QSPI */ 100*7931d332SJit Loon Lim mailbox_hps_qspi_enable(); 101*7931d332SJit Loon Lim 102*7931d332SJit Loon Lim switch (boot_source) { 103*7931d332SJit Loon Lim case BOOT_SOURCE_SDMMC: 104*7931d332SJit Loon Lim NOTICE("SDMMC boot\n"); 105*7931d332SJit Loon Lim sdmmc_init(&reverse_handoff_ptr, ¶ms, &mmc_info); 106*7931d332SJit Loon Lim socfpga_io_setup(boot_source); 107*7931d332SJit Loon Lim break; 108*7931d332SJit Loon Lim 109*7931d332SJit Loon Lim case BOOT_SOURCE_QSPI: 110*7931d332SJit Loon Lim NOTICE("QSPI boot\n"); 111*7931d332SJit Loon Lim cad_qspi_init(0, QSPI_CONFIG_CPHA, QSPI_CONFIG_CPOL, 112*7931d332SJit Loon Lim QSPI_CONFIG_CSDA, QSPI_CONFIG_CSDADS, 113*7931d332SJit Loon Lim QSPI_CONFIG_CSEOT, QSPI_CONFIG_CSSOT, 0); 114*7931d332SJit Loon Lim socfpga_io_setup(boot_source); 115*7931d332SJit Loon Lim break; 116*7931d332SJit Loon Lim 117*7931d332SJit Loon Lim case BOOT_SOURCE_NAND: 118*7931d332SJit Loon Lim NOTICE("NAND boot\n"); 119*7931d332SJit Loon Lim nand_init(&reverse_handoff_ptr); 120*7931d332SJit Loon Lim socfpga_io_setup(boot_source); 121*7931d332SJit Loon Lim break; 122*7931d332SJit Loon Lim 123*7931d332SJit Loon Lim default: 124*7931d332SJit Loon Lim ERROR("Unsupported boot source\n"); 125*7931d332SJit Loon Lim panic(); 126*7931d332SJit Loon Lim break; 127*7931d332SJit Loon Lim } 128*7931d332SJit Loon Lim } 129*7931d332SJit Loon Lim 130*7931d332SJit Loon Lim uint32_t get_spsr_for_bl33_entry(void) 131*7931d332SJit Loon Lim { 132*7931d332SJit Loon Lim unsigned long el_status; 133*7931d332SJit Loon Lim unsigned int mode; 134*7931d332SJit Loon Lim uint32_t spsr; 135*7931d332SJit Loon Lim 136*7931d332SJit Loon Lim /* Figure out what mode we enter the non-secure world in */ 137*7931d332SJit Loon Lim el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT; 138*7931d332SJit Loon Lim el_status &= ID_AA64PFR0_ELX_MASK; 139*7931d332SJit Loon Lim 140*7931d332SJit Loon Lim mode = (el_status) ? MODE_EL2 : MODE_EL1; 141*7931d332SJit Loon Lim 142*7931d332SJit Loon Lim /* 143*7931d332SJit Loon Lim * TODO: Consider the possibility of specifying the SPSR in 144*7931d332SJit Loon Lim * the FIP ToC and allowing the platform to have a say as 145*7931d332SJit Loon Lim * well. 146*7931d332SJit Loon Lim */ 147*7931d332SJit Loon Lim spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); 148*7931d332SJit Loon Lim return spsr; 149*7931d332SJit Loon Lim } 150*7931d332SJit Loon Lim 151*7931d332SJit Loon Lim int bl2_plat_handle_post_image_load(unsigned int image_id) 152*7931d332SJit Loon Lim { 153*7931d332SJit Loon Lim bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id); 154*7931d332SJit Loon Lim 155*7931d332SJit Loon Lim assert(bl_mem_params); 156*7931d332SJit Loon Lim 157*7931d332SJit Loon Lim switch (image_id) { 158*7931d332SJit Loon Lim case BL33_IMAGE_ID: 159*7931d332SJit Loon Lim bl_mem_params->ep_info.args.arg0 = 0xffff & read_mpidr(); 160*7931d332SJit Loon Lim bl_mem_params->ep_info.spsr = get_spsr_for_bl33_entry(); 161*7931d332SJit Loon Lim break; 162*7931d332SJit Loon Lim default: 163*7931d332SJit Loon Lim break; 164*7931d332SJit Loon Lim } 165*7931d332SJit Loon Lim 166*7931d332SJit Loon Lim return 0; 167*7931d332SJit Loon Lim } 168*7931d332SJit Loon Lim 169*7931d332SJit Loon Lim /******************************************************************************* 170*7931d332SJit Loon Lim * Perform any BL3-1 platform setup code 171*7931d332SJit Loon Lim ******************************************************************************/ 172*7931d332SJit Loon Lim void bl2_platform_setup(void) 173*7931d332SJit Loon Lim { 174*7931d332SJit Loon Lim } 175