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