1*3b0de918SJiafei Pan /* 2*3b0de918SJiafei Pan * Copyright 2018-2021 NXP 3*3b0de918SJiafei Pan * 4*3b0de918SJiafei Pan * SPDX-License-Identifier: BSD-3-Clause 5*3b0de918SJiafei Pan */ 6*3b0de918SJiafei Pan 7*3b0de918SJiafei Pan #include <assert.h> 8*3b0de918SJiafei Pan 9*3b0de918SJiafei Pan #include <arch.h> 10*3b0de918SJiafei Pan #include <caam.h> 11*3b0de918SJiafei Pan #include <cassert.h> 12*3b0de918SJiafei Pan #include <cci.h> 13*3b0de918SJiafei Pan #include <common/debug.h> 14*3b0de918SJiafei Pan #include <dcfg.h> 15*3b0de918SJiafei Pan #ifdef I2C_INIT 16*3b0de918SJiafei Pan #include <i2c.h> 17*3b0de918SJiafei Pan #endif 18*3b0de918SJiafei Pan #include <lib/mmio.h> 19*3b0de918SJiafei Pan #include <lib/xlat_tables/xlat_tables_v2.h> 20*3b0de918SJiafei Pan #include <ls_interconnect.h> 21*3b0de918SJiafei Pan #ifdef POLICY_FUSE_PROVISION 22*3b0de918SJiafei Pan #include <nxp_gpio.h> 23*3b0de918SJiafei Pan #endif 24*3b0de918SJiafei Pan #if TRUSTED_BOARD_BOOT 25*3b0de918SJiafei Pan #include <nxp_smmu.h> 26*3b0de918SJiafei Pan #endif 27*3b0de918SJiafei Pan #include <nxp_timer.h> 28*3b0de918SJiafei Pan #include <plat_console.h> 29*3b0de918SJiafei Pan #include <plat_gic.h> 30*3b0de918SJiafei Pan #include <plat_tzc380.h> 31*3b0de918SJiafei Pan #include <scfg.h> 32*3b0de918SJiafei Pan #if defined(NXP_SFP_ENABLED) 33*3b0de918SJiafei Pan #include <sfp.h> 34*3b0de918SJiafei Pan #endif 35*3b0de918SJiafei Pan 36*3b0de918SJiafei Pan #include <errata.h> 37*3b0de918SJiafei Pan #include <ns_access.h> 38*3b0de918SJiafei Pan #ifdef CONFIG_OCRAM_ECC_EN 39*3b0de918SJiafei Pan #include <ocram.h> 40*3b0de918SJiafei Pan #endif 41*3b0de918SJiafei Pan #include <plat_common.h> 42*3b0de918SJiafei Pan #include <platform_def.h> 43*3b0de918SJiafei Pan #include <soc.h> 44*3b0de918SJiafei Pan 45*3b0de918SJiafei Pan static dcfg_init_info_t dcfg_init_data = { 46*3b0de918SJiafei Pan .g_nxp_dcfg_addr = NXP_DCFG_ADDR, 47*3b0de918SJiafei Pan .nxp_sysclk_freq = NXP_SYSCLK_FREQ, 48*3b0de918SJiafei Pan .nxp_ddrclk_freq = NXP_DDRCLK_FREQ, 49*3b0de918SJiafei Pan .nxp_plat_clk_divider = NXP_PLATFORM_CLK_DIVIDER, 50*3b0de918SJiafei Pan }; 51*3b0de918SJiafei Pan 52*3b0de918SJiafei Pan 53*3b0de918SJiafei Pan /* Function to return the SoC SYS CLK */ 54*3b0de918SJiafei Pan unsigned int get_sys_clk(void) 55*3b0de918SJiafei Pan { 56*3b0de918SJiafei Pan return NXP_SYSCLK_FREQ; 57*3b0de918SJiafei Pan } 58*3b0de918SJiafei Pan 59*3b0de918SJiafei Pan /* 60*3b0de918SJiafei Pan * Function returns the base counter frequency 61*3b0de918SJiafei Pan * after reading the first entry at CNTFID0 (0x20 offset). 62*3b0de918SJiafei Pan * 63*3b0de918SJiafei Pan * Function is used by: 64*3b0de918SJiafei Pan * 1. ARM common code for PSCI management. 65*3b0de918SJiafei Pan * 2. ARM Generic Timer init. 66*3b0de918SJiafei Pan * 67*3b0de918SJiafei Pan */ 68*3b0de918SJiafei Pan unsigned int plat_get_syscnt_freq2(void) 69*3b0de918SJiafei Pan { 70*3b0de918SJiafei Pan unsigned int counter_base_frequency; 71*3b0de918SJiafei Pan 72*3b0de918SJiafei Pan counter_base_frequency = get_sys_clk()/4; 73*3b0de918SJiafei Pan 74*3b0de918SJiafei Pan return counter_base_frequency; 75*3b0de918SJiafei Pan } 76*3b0de918SJiafei Pan 77*3b0de918SJiafei Pan #ifdef IMAGE_BL2 78*3b0de918SJiafei Pan 79*3b0de918SJiafei Pan static struct soc_type soc_list[] = { 80*3b0de918SJiafei Pan SOC_ENTRY(LS1023A, LS1023A, 1, 2), 81*3b0de918SJiafei Pan SOC_ENTRY(LS1023AE, LS1023AE, 1, 2), 82*3b0de918SJiafei Pan SOC_ENTRY(LS1023A_P23, LS1023A_P23, 1, 2), 83*3b0de918SJiafei Pan SOC_ENTRY(LS1023AE_P23, LS1023AE_P23, 1, 2), 84*3b0de918SJiafei Pan SOC_ENTRY(LS1043A, LS1043A, 1, 4), 85*3b0de918SJiafei Pan SOC_ENTRY(LS1043AE, LS1043AE, 1, 4), 86*3b0de918SJiafei Pan SOC_ENTRY(LS1043A_P23, LS1043A_P23, 1, 4), 87*3b0de918SJiafei Pan SOC_ENTRY(LS1043AE_P23, LS1043AE_P23, 1, 4), 88*3b0de918SJiafei Pan }; 89*3b0de918SJiafei Pan 90*3b0de918SJiafei Pan #ifdef POLICY_FUSE_PROVISION 91*3b0de918SJiafei Pan static gpio_init_info_t gpio_init_data = { 92*3b0de918SJiafei Pan .gpio1_base_addr = NXP_GPIO1_ADDR, 93*3b0de918SJiafei Pan .gpio2_base_addr = NXP_GPIO2_ADDR, 94*3b0de918SJiafei Pan .gpio3_base_addr = NXP_GPIO3_ADDR, 95*3b0de918SJiafei Pan .gpio4_base_addr = NXP_GPIO4_ADDR, 96*3b0de918SJiafei Pan }; 97*3b0de918SJiafei Pan #endif 98*3b0de918SJiafei Pan 99*3b0de918SJiafei Pan /* 100*3b0de918SJiafei Pan * Function to set the base counter frequency at 101*3b0de918SJiafei Pan * the first entry of the Frequency Mode Table, 102*3b0de918SJiafei Pan * at CNTFID0 (0x20 offset). 103*3b0de918SJiafei Pan * 104*3b0de918SJiafei Pan * Set the value of the pirmary core register cntfrq_el0. 105*3b0de918SJiafei Pan */ 106*3b0de918SJiafei Pan static void set_base_freq_CNTFID0(void) 107*3b0de918SJiafei Pan { 108*3b0de918SJiafei Pan /* 109*3b0de918SJiafei Pan * Below register specifies the base frequency of the system counter. 110*3b0de918SJiafei Pan * As per NXP Board Manuals: 111*3b0de918SJiafei Pan * The system counter always works with SYS_REF_CLK/4 frequency clock. 112*3b0de918SJiafei Pan * 113*3b0de918SJiafei Pan */ 114*3b0de918SJiafei Pan unsigned int counter_base_frequency = get_sys_clk()/4; 115*3b0de918SJiafei Pan 116*3b0de918SJiafei Pan /* 117*3b0de918SJiafei Pan * Setting the frequency in the Frequency modes table. 118*3b0de918SJiafei Pan * 119*3b0de918SJiafei Pan * Note: The value for ls1046ardb board at this offset 120*3b0de918SJiafei Pan * is not RW as stated. This offset have the 121*3b0de918SJiafei Pan * fixed value of 100000400 Hz. 122*3b0de918SJiafei Pan * 123*3b0de918SJiafei Pan * The below code line has no effect. 124*3b0de918SJiafei Pan * Keeping it for other platforms where it has effect. 125*3b0de918SJiafei Pan */ 126*3b0de918SJiafei Pan mmio_write_32(NXP_TIMER_ADDR + CNTFID_OFF, counter_base_frequency); 127*3b0de918SJiafei Pan 128*3b0de918SJiafei Pan write_cntfrq_el0(counter_base_frequency); 129*3b0de918SJiafei Pan } 130*3b0de918SJiafei Pan 131*3b0de918SJiafei Pan void soc_preload_setup(void) 132*3b0de918SJiafei Pan { 133*3b0de918SJiafei Pan 134*3b0de918SJiafei Pan } 135*3b0de918SJiafei Pan 136*3b0de918SJiafei Pan /******************************************************************************* 137*3b0de918SJiafei Pan * This function implements soc specific erratas 138*3b0de918SJiafei Pan * This is called before DDR is initialized or MMU is enabled 139*3b0de918SJiafei Pan ******************************************************************************/ 140*3b0de918SJiafei Pan void soc_early_init(void) 141*3b0de918SJiafei Pan { 142*3b0de918SJiafei Pan uint8_t num_clusters, cores_per_cluster; 143*3b0de918SJiafei Pan dram_regions_info_t *dram_regions_info = get_dram_regions_info(); 144*3b0de918SJiafei Pan 145*3b0de918SJiafei Pan #ifdef CONFIG_OCRAM_ECC_EN 146*3b0de918SJiafei Pan ocram_init(NXP_OCRAM_ADDR, NXP_OCRAM_SIZE); 147*3b0de918SJiafei Pan #endif 148*3b0de918SJiafei Pan dcfg_init(&dcfg_init_data); 149*3b0de918SJiafei Pan #ifdef POLICY_FUSE_PROVISION 150*3b0de918SJiafei Pan gpio_init(&gpio_init_data); 151*3b0de918SJiafei Pan sec_init(NXP_CAAM_ADDR); 152*3b0de918SJiafei Pan #endif 153*3b0de918SJiafei Pan #if LOG_LEVEL > 0 154*3b0de918SJiafei Pan /* Initialize the console to provide early debug support */ 155*3b0de918SJiafei Pan 156*3b0de918SJiafei Pan plat_console_init(NXP_CONSOLE_ADDR, 157*3b0de918SJiafei Pan NXP_UART_CLK_DIVIDER, NXP_CONSOLE_BAUDRATE); 158*3b0de918SJiafei Pan #endif 159*3b0de918SJiafei Pan set_base_freq_CNTFID0(); 160*3b0de918SJiafei Pan 161*3b0de918SJiafei Pan /* Enable snooping on SEC read and write transactions */ 162*3b0de918SJiafei Pan scfg_setbits32((void *)(NXP_SCFG_ADDR + SCFG_SNPCNFGCR_OFFSET), 163*3b0de918SJiafei Pan SCFG_SNPCNFGCR_SECRDSNP | SCFG_SNPCNFGCR_SECWRSNP); 164*3b0de918SJiafei Pan 165*3b0de918SJiafei Pan /* 166*3b0de918SJiafei Pan * Initialize Interconnect for this cluster during cold boot. 167*3b0de918SJiafei Pan * No need for locks as no other CPU is active. 168*3b0de918SJiafei Pan */ 169*3b0de918SJiafei Pan cci_init(NXP_CCI_ADDR, cci_map, ARRAY_SIZE(cci_map)); 170*3b0de918SJiafei Pan 171*3b0de918SJiafei Pan /* 172*3b0de918SJiafei Pan * Enable Interconnect coherency for the primary CPU's cluster. 173*3b0de918SJiafei Pan */ 174*3b0de918SJiafei Pan get_cluster_info(soc_list, ARRAY_SIZE(soc_list), &num_clusters, &cores_per_cluster); 175*3b0de918SJiafei Pan plat_ls_interconnect_enter_coherency(num_clusters); 176*3b0de918SJiafei Pan 177*3b0de918SJiafei Pan #if TRUSTED_BOARD_BOOT 178*3b0de918SJiafei Pan uint32_t mode; 179*3b0de918SJiafei Pan 180*3b0de918SJiafei Pan sfp_init(NXP_SFP_ADDR); 181*3b0de918SJiafei Pan /* 182*3b0de918SJiafei Pan * For secure boot disable SMMU. 183*3b0de918SJiafei Pan * Later when platform security policy comes in picture, 184*3b0de918SJiafei Pan * this might get modified based on the policy 185*3b0de918SJiafei Pan */ 186*3b0de918SJiafei Pan if (check_boot_mode_secure(&mode) == true) { 187*3b0de918SJiafei Pan bypass_smmu(NXP_SMMU_ADDR); 188*3b0de918SJiafei Pan } 189*3b0de918SJiafei Pan 190*3b0de918SJiafei Pan /* 191*3b0de918SJiafei Pan * For Mbedtls currently crypto is not supported via CAAM 192*3b0de918SJiafei Pan * enable it when that support is there. In tbbr.mk 193*3b0de918SJiafei Pan * the CAAM_INTEG is set as 0. 194*3b0de918SJiafei Pan */ 195*3b0de918SJiafei Pan 196*3b0de918SJiafei Pan #ifndef MBEDTLS_X509 197*3b0de918SJiafei Pan /* Initialize the crypto accelerator if enabled */ 198*3b0de918SJiafei Pan if (is_sec_enabled() == false) { 199*3b0de918SJiafei Pan INFO("SEC is disabled.\n"); 200*3b0de918SJiafei Pan } else { 201*3b0de918SJiafei Pan sec_init(NXP_CAAM_ADDR); 202*3b0de918SJiafei Pan } 203*3b0de918SJiafei Pan #endif 204*3b0de918SJiafei Pan #elif defined(POLICY_FUSE_PROVISION) 205*3b0de918SJiafei Pan gpio_init(&gpio_init_data); 206*3b0de918SJiafei Pan sfp_init(NXP_SFP_ADDR); 207*3b0de918SJiafei Pan sec_init(NXP_CAAM_ADDR); 208*3b0de918SJiafei Pan #endif 209*3b0de918SJiafei Pan 210*3b0de918SJiafei Pan soc_errata(); 211*3b0de918SJiafei Pan 212*3b0de918SJiafei Pan /* 213*3b0de918SJiafei Pan * Initialize system level generic timer for Layerscape Socs. 214*3b0de918SJiafei Pan */ 215*3b0de918SJiafei Pan delay_timer_init(NXP_TIMER_ADDR); 216*3b0de918SJiafei Pan 217*3b0de918SJiafei Pan #ifdef DDR_INIT 218*3b0de918SJiafei Pan i2c_init(NXP_I2C_ADDR); 219*3b0de918SJiafei Pan dram_regions_info->total_dram_size = init_ddr(); 220*3b0de918SJiafei Pan #endif 221*3b0de918SJiafei Pan } 222*3b0de918SJiafei Pan 223*3b0de918SJiafei Pan void soc_bl2_prepare_exit(void) 224*3b0de918SJiafei Pan { 225*3b0de918SJiafei Pan #if defined(NXP_SFP_ENABLED) && defined(DISABLE_FUSE_WRITE) 226*3b0de918SJiafei Pan set_sfp_wr_disable(); 227*3b0de918SJiafei Pan #endif 228*3b0de918SJiafei Pan } 229*3b0de918SJiafei Pan 230*3b0de918SJiafei Pan /***************************************************************************** 231*3b0de918SJiafei Pan * This function returns the boot device based on RCW_SRC 232*3b0de918SJiafei Pan ****************************************************************************/ 233*3b0de918SJiafei Pan enum boot_device get_boot_dev(void) 234*3b0de918SJiafei Pan { 235*3b0de918SJiafei Pan enum boot_device src = BOOT_DEVICE_NONE; 236*3b0de918SJiafei Pan uint32_t porsr1; 237*3b0de918SJiafei Pan uint32_t rcw_src, val; 238*3b0de918SJiafei Pan 239*3b0de918SJiafei Pan porsr1 = read_reg_porsr1(); 240*3b0de918SJiafei Pan 241*3b0de918SJiafei Pan rcw_src = (porsr1 & PORSR1_RCW_MASK) >> PORSR1_RCW_SHIFT; 242*3b0de918SJiafei Pan 243*3b0de918SJiafei Pan val = rcw_src & RCW_SRC_NAND_MASK; 244*3b0de918SJiafei Pan 245*3b0de918SJiafei Pan if (val == RCW_SRC_NAND_VAL) { 246*3b0de918SJiafei Pan val = rcw_src & NAND_RESERVED_MASK; 247*3b0de918SJiafei Pan if ((val != NAND_RESERVED_1) && (val != NAND_RESERVED_2)) { 248*3b0de918SJiafei Pan src = BOOT_DEVICE_IFC_NAND; 249*3b0de918SJiafei Pan INFO("RCW BOOT SRC is IFC NAND\n"); 250*3b0de918SJiafei Pan } 251*3b0de918SJiafei Pan } else { 252*3b0de918SJiafei Pan /* RCW SRC NOR */ 253*3b0de918SJiafei Pan val = rcw_src & RCW_SRC_NOR_MASK; 254*3b0de918SJiafei Pan if (val == NOR_8B_VAL || val == NOR_16B_VAL) { 255*3b0de918SJiafei Pan src = BOOT_DEVICE_IFC_NOR; 256*3b0de918SJiafei Pan INFO("RCW BOOT SRC is IFC NOR\n"); 257*3b0de918SJiafei Pan } else { 258*3b0de918SJiafei Pan switch (rcw_src) { 259*3b0de918SJiafei Pan case QSPI_VAL1: 260*3b0de918SJiafei Pan case QSPI_VAL2: 261*3b0de918SJiafei Pan src = BOOT_DEVICE_QSPI; 262*3b0de918SJiafei Pan INFO("RCW BOOT SRC is QSPI\n"); 263*3b0de918SJiafei Pan break; 264*3b0de918SJiafei Pan case SD_VAL: 265*3b0de918SJiafei Pan src = BOOT_DEVICE_EMMC; 266*3b0de918SJiafei Pan INFO("RCW BOOT SRC is SD/EMMC\n"); 267*3b0de918SJiafei Pan break; 268*3b0de918SJiafei Pan default: 269*3b0de918SJiafei Pan src = BOOT_DEVICE_NONE; 270*3b0de918SJiafei Pan } 271*3b0de918SJiafei Pan } 272*3b0de918SJiafei Pan } 273*3b0de918SJiafei Pan 274*3b0de918SJiafei Pan return src; 275*3b0de918SJiafei Pan } 276*3b0de918SJiafei Pan 277*3b0de918SJiafei Pan /* This function sets up access permissions on memory regions */ 278*3b0de918SJiafei Pan void soc_mem_access(void) 279*3b0de918SJiafei Pan { 280*3b0de918SJiafei Pan struct tzc380_reg tzc380_reg_list[MAX_NUM_TZC_REGION]; 281*3b0de918SJiafei Pan int dram_idx, index = 0U; 282*3b0de918SJiafei Pan dram_regions_info_t *info_dram_regions = get_dram_regions_info(); 283*3b0de918SJiafei Pan 284*3b0de918SJiafei Pan for (dram_idx = 0U; dram_idx < info_dram_regions->num_dram_regions; 285*3b0de918SJiafei Pan dram_idx++) { 286*3b0de918SJiafei Pan if (info_dram_regions->region[dram_idx].size == 0) { 287*3b0de918SJiafei Pan ERROR("DDR init failure, or"); 288*3b0de918SJiafei Pan ERROR("DRAM regions not populated correctly.\n"); 289*3b0de918SJiafei Pan break; 290*3b0de918SJiafei Pan } 291*3b0de918SJiafei Pan 292*3b0de918SJiafei Pan index = populate_tzc380_reg_list(tzc380_reg_list, 293*3b0de918SJiafei Pan dram_idx, index, 294*3b0de918SJiafei Pan info_dram_regions->region[dram_idx].addr, 295*3b0de918SJiafei Pan info_dram_regions->region[dram_idx].size, 296*3b0de918SJiafei Pan NXP_SECURE_DRAM_SIZE, NXP_SP_SHRD_DRAM_SIZE); 297*3b0de918SJiafei Pan } 298*3b0de918SJiafei Pan 299*3b0de918SJiafei Pan mem_access_setup(NXP_TZC_ADDR, index, tzc380_reg_list); 300*3b0de918SJiafei Pan 301*3b0de918SJiafei Pan /* Configure CSU secure access register to disable TZASC bypass mux */ 302*3b0de918SJiafei Pan mmio_write_32((uintptr_t)(NXP_CSU_ADDR + 303*3b0de918SJiafei Pan CSU_SEC_ACCESS_REG_OFFSET), 304*3b0de918SJiafei Pan bswap32(TZASC_BYPASS_MUX_DISABLE)); 305*3b0de918SJiafei Pan } 306*3b0de918SJiafei Pan 307*3b0de918SJiafei Pan 308*3b0de918SJiafei Pan #else 309*3b0de918SJiafei Pan const unsigned char _power_domain_tree_desc[] = {1, 1, 4}; 310*3b0de918SJiafei Pan 311*3b0de918SJiafei Pan CASSERT(NUMBER_OF_CLUSTERS && NUMBER_OF_CLUSTERS <= 256, 312*3b0de918SJiafei Pan assert_invalid_ls1043_cluster_count); 313*3b0de918SJiafei Pan 314*3b0de918SJiafei Pan /* This function returns the SoC topology */ 315*3b0de918SJiafei Pan const unsigned char *plat_get_power_domain_tree_desc(void) 316*3b0de918SJiafei Pan { 317*3b0de918SJiafei Pan 318*3b0de918SJiafei Pan return _power_domain_tree_desc; 319*3b0de918SJiafei Pan } 320*3b0de918SJiafei Pan 321*3b0de918SJiafei Pan /* 322*3b0de918SJiafei Pan * This function returns the core count within the cluster corresponding to 323*3b0de918SJiafei Pan * `mpidr`. 324*3b0de918SJiafei Pan */ 325*3b0de918SJiafei Pan unsigned int plat_ls_get_cluster_core_count(u_register_t mpidr) 326*3b0de918SJiafei Pan { 327*3b0de918SJiafei Pan return CORES_PER_CLUSTER; 328*3b0de918SJiafei Pan } 329*3b0de918SJiafei Pan 330*3b0de918SJiafei Pan void soc_early_platform_setup2(void) 331*3b0de918SJiafei Pan { 332*3b0de918SJiafei Pan dcfg_init(&dcfg_init_data); 333*3b0de918SJiafei Pan /* Initialize system level generic timer for Socs */ 334*3b0de918SJiafei Pan delay_timer_init(NXP_TIMER_ADDR); 335*3b0de918SJiafei Pan 336*3b0de918SJiafei Pan #if LOG_LEVEL > 0 337*3b0de918SJiafei Pan /* Initialize the console to provide early debug support */ 338*3b0de918SJiafei Pan plat_console_init(NXP_CONSOLE_ADDR, 339*3b0de918SJiafei Pan NXP_UART_CLK_DIVIDER, NXP_CONSOLE_BAUDRATE); 340*3b0de918SJiafei Pan #endif 341*3b0de918SJiafei Pan } 342*3b0de918SJiafei Pan 343*3b0de918SJiafei Pan /* 344*3b0de918SJiafei Pan * For LS1043a rev1.0, GIC base address align with 4k. 345*3b0de918SJiafei Pan * For LS1043a rev1.1, if DCFG_GIC400_ALIGN[GIC_ADDR_BIT] 346*3b0de918SJiafei Pan * is set, GIC base address align with 4K, or else align 347*3b0de918SJiafei Pan * with 64k. 348*3b0de918SJiafei Pan */ 349*3b0de918SJiafei Pan void get_gic_offset(uint32_t *gicc_base, uint32_t *gicd_base) 350*3b0de918SJiafei Pan { 351*3b0de918SJiafei Pan uint32_t *ccsr_svr = (uint32_t *)(NXP_DCFG_ADDR + DCFG_SVR_OFFSET); 352*3b0de918SJiafei Pan uint32_t *gic_align = (uint32_t *)(NXP_SCFG_ADDR + 353*3b0de918SJiafei Pan SCFG_GIC400_ADDR_ALIGN_OFFSET); 354*3b0de918SJiafei Pan uint32_t val; 355*3b0de918SJiafei Pan 356*3b0de918SJiafei Pan val = be32toh(mmio_read_32((uintptr_t)ccsr_svr)); 357*3b0de918SJiafei Pan 358*3b0de918SJiafei Pan if ((val & 0xff) == REV1_1) { 359*3b0de918SJiafei Pan val = be32toh(mmio_read_32((uintptr_t)gic_align)); 360*3b0de918SJiafei Pan if (val & (1L << GIC_ADDR_BIT)) { 361*3b0de918SJiafei Pan *gicc_base = NXP_GICC_4K_ADDR; 362*3b0de918SJiafei Pan *gicd_base = NXP_GICD_4K_ADDR; 363*3b0de918SJiafei Pan } else { 364*3b0de918SJiafei Pan *gicc_base = NXP_GICC_64K_ADDR; 365*3b0de918SJiafei Pan *gicd_base = NXP_GICD_64K_ADDR; 366*3b0de918SJiafei Pan } 367*3b0de918SJiafei Pan } else { 368*3b0de918SJiafei Pan *gicc_base = NXP_GICC_4K_ADDR; 369*3b0de918SJiafei Pan *gicd_base = NXP_GICD_4K_ADDR; 370*3b0de918SJiafei Pan } 371*3b0de918SJiafei Pan } 372*3b0de918SJiafei Pan 373*3b0de918SJiafei Pan void soc_platform_setup(void) 374*3b0de918SJiafei Pan { 375*3b0de918SJiafei Pan /* Initialize the GIC driver, cpu and distributor interfaces */ 376*3b0de918SJiafei Pan static uint32_t target_mask_array[PLATFORM_CORE_COUNT]; 377*3b0de918SJiafei Pan /* 378*3b0de918SJiafei Pan * On a GICv2 system, the Group 1 secure interrupts are treated 379*3b0de918SJiafei Pan * as Group 0 interrupts. 380*3b0de918SJiafei Pan */ 381*3b0de918SJiafei Pan static interrupt_prop_t ls_interrupt_props[] = { 382*3b0de918SJiafei Pan PLAT_LS_G1S_IRQ_PROPS(GICV2_INTR_GROUP0), 383*3b0de918SJiafei Pan PLAT_LS_G0_IRQ_PROPS(GICV2_INTR_GROUP0) 384*3b0de918SJiafei Pan }; 385*3b0de918SJiafei Pan static uint32_t gicc_base, gicd_base; 386*3b0de918SJiafei Pan 387*3b0de918SJiafei Pan get_gic_offset(&gicc_base, &gicd_base); 388*3b0de918SJiafei Pan plat_ls_gic_driver_init(gicd_base, gicc_base, 389*3b0de918SJiafei Pan PLATFORM_CORE_COUNT, 390*3b0de918SJiafei Pan ls_interrupt_props, 391*3b0de918SJiafei Pan ARRAY_SIZE(ls_interrupt_props), 392*3b0de918SJiafei Pan target_mask_array); 393*3b0de918SJiafei Pan 394*3b0de918SJiafei Pan plat_ls_gic_init(); 395*3b0de918SJiafei Pan enable_init_timer(); 396*3b0de918SJiafei Pan } 397*3b0de918SJiafei Pan 398*3b0de918SJiafei Pan /* This function initializes the soc from the BL31 module */ 399*3b0de918SJiafei Pan void soc_init(void) 400*3b0de918SJiafei Pan { 401*3b0de918SJiafei Pan /* low-level init of the soc */ 402*3b0de918SJiafei Pan soc_init_lowlevel(); 403*3b0de918SJiafei Pan _init_global_data(); 404*3b0de918SJiafei Pan soc_init_percpu(); 405*3b0de918SJiafei Pan _initialize_psci(); 406*3b0de918SJiafei Pan 407*3b0de918SJiafei Pan /* 408*3b0de918SJiafei Pan * Initialize the interconnect during cold boot. 409*3b0de918SJiafei Pan * No need for locks as no other CPU is active. 410*3b0de918SJiafei Pan */ 411*3b0de918SJiafei Pan cci_init(NXP_CCI_ADDR, cci_map, ARRAY_SIZE(cci_map)); 412*3b0de918SJiafei Pan 413*3b0de918SJiafei Pan /* 414*3b0de918SJiafei Pan * Enable coherency in interconnect for the primary CPU's cluster. 415*3b0de918SJiafei Pan * Earlier bootloader stages might already do this but we can't 416*3b0de918SJiafei Pan * assume so. No harm in executing this code twice. 417*3b0de918SJiafei Pan */ 418*3b0de918SJiafei Pan cci_enable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr())); 419*3b0de918SJiafei Pan 420*3b0de918SJiafei Pan /* Init CSU to enable non-secure access to peripherals */ 421*3b0de918SJiafei Pan enable_layerscape_ns_access(ns_dev, ARRAY_SIZE(ns_dev), NXP_CSU_ADDR); 422*3b0de918SJiafei Pan 423*3b0de918SJiafei Pan /* Initialize the crypto accelerator if enabled */ 424*3b0de918SJiafei Pan if (is_sec_enabled() == false) { 425*3b0de918SJiafei Pan INFO("SEC is disabled.\n"); 426*3b0de918SJiafei Pan } else { 427*3b0de918SJiafei Pan sec_init(NXP_CAAM_ADDR); 428*3b0de918SJiafei Pan } 429*3b0de918SJiafei Pan } 430*3b0de918SJiafei Pan 431*3b0de918SJiafei Pan void soc_runtime_setup(void) 432*3b0de918SJiafei Pan { 433*3b0de918SJiafei Pan 434*3b0de918SJiafei Pan } 435*3b0de918SJiafei Pan #endif 436