1*9df5ba05SJiafei Pan /* 2*9df5ba05SJiafei Pan * Copyright 2022 NXP 3*9df5ba05SJiafei Pan * 4*9df5ba05SJiafei Pan * SPDX-License-Identifier: BSD-3-Clause 5*9df5ba05SJiafei Pan */ 6*9df5ba05SJiafei Pan 7*9df5ba05SJiafei Pan #include <assert.h> 8*9df5ba05SJiafei Pan 9*9df5ba05SJiafei Pan #include <arch.h> 10*9df5ba05SJiafei Pan #include <caam.h> 11*9df5ba05SJiafei Pan #include <cci.h> 12*9df5ba05SJiafei Pan #include <common/debug.h> 13*9df5ba05SJiafei Pan #include <dcfg.h> 14*9df5ba05SJiafei Pan #ifdef I2C_INIT 15*9df5ba05SJiafei Pan #include <i2c.h> 16*9df5ba05SJiafei Pan #endif 17*9df5ba05SJiafei Pan #include <lib/mmio.h> 18*9df5ba05SJiafei Pan #include <lib/xlat_tables/xlat_tables_v2.h> 19*9df5ba05SJiafei Pan #include <ls_interconnect.h> 20*9df5ba05SJiafei Pan #if TRUSTED_BOARD_BOOT 21*9df5ba05SJiafei Pan #include <nxp_smmu.h> 22*9df5ba05SJiafei Pan #endif 23*9df5ba05SJiafei Pan #include <nxp_timer.h> 24*9df5ba05SJiafei Pan #include <plat_console.h> 25*9df5ba05SJiafei Pan #include <plat_gic.h> 26*9df5ba05SJiafei Pan #include <plat_tzc400.h> 27*9df5ba05SJiafei Pan #include <pmu.h> 28*9df5ba05SJiafei Pan #if defined(NXP_SFP_ENABLED) 29*9df5ba05SJiafei Pan #include <sfp.h> 30*9df5ba05SJiafei Pan #endif 31*9df5ba05SJiafei Pan 32*9df5ba05SJiafei Pan #include <errata.h> 33*9df5ba05SJiafei Pan #ifdef CONFIG_OCRAM_ECC_EN 34*9df5ba05SJiafei Pan #include <ocram.h> 35*9df5ba05SJiafei Pan #endif 36*9df5ba05SJiafei Pan #include <plat_common.h> 37*9df5ba05SJiafei Pan #include <platform_def.h> 38*9df5ba05SJiafei Pan #include <soc.h> 39*9df5ba05SJiafei Pan 40*9df5ba05SJiafei Pan static unsigned char _power_domain_tree_desc[NUMBER_OF_CLUSTERS + 2]; 41*9df5ba05SJiafei Pan static struct soc_type soc_list[] = { 42*9df5ba05SJiafei Pan SOC_ENTRY(LS1044A, LS1044A, 1, 4), 43*9df5ba05SJiafei Pan SOC_ENTRY(LS1044AE, LS1044AE, 1, 4), 44*9df5ba05SJiafei Pan SOC_ENTRY(LS1048A, LS1048A, 1, 4), 45*9df5ba05SJiafei Pan SOC_ENTRY(LS1048AE, LS1048AE, 1, 4), 46*9df5ba05SJiafei Pan SOC_ENTRY(LS1084A, LS1084A, 2, 4), 47*9df5ba05SJiafei Pan SOC_ENTRY(LS1084AE, LS1084AE, 2, 4), 48*9df5ba05SJiafei Pan SOC_ENTRY(LS1088A, LS1088A, 2, 4), 49*9df5ba05SJiafei Pan SOC_ENTRY(LS1088AE, LS1088AE, 2, 4), 50*9df5ba05SJiafei Pan }; 51*9df5ba05SJiafei Pan 52*9df5ba05SJiafei Pan static dcfg_init_info_t dcfg_init_data = { 53*9df5ba05SJiafei Pan .g_nxp_dcfg_addr = NXP_DCFG_ADDR, 54*9df5ba05SJiafei Pan .nxp_sysclk_freq = NXP_SYSCLK_FREQ, 55*9df5ba05SJiafei Pan .nxp_ddrclk_freq = NXP_DDRCLK_FREQ, 56*9df5ba05SJiafei Pan .nxp_plat_clk_divider = NXP_PLATFORM_CLK_DIVIDER, 57*9df5ba05SJiafei Pan }; 58*9df5ba05SJiafei Pan 59*9df5ba05SJiafei Pan /* 60*9df5ba05SJiafei Pan * This function dynamically constructs the topology according to 61*9df5ba05SJiafei Pan * SoC Flavor and returns it. 62*9df5ba05SJiafei Pan */ 63*9df5ba05SJiafei Pan const unsigned char *plat_get_power_domain_tree_desc(void) 64*9df5ba05SJiafei Pan { 65*9df5ba05SJiafei Pan unsigned int i; 66*9df5ba05SJiafei Pan uint8_t num_clusters, cores_per_cluster; 67*9df5ba05SJiafei Pan 68*9df5ba05SJiafei Pan get_cluster_info(soc_list, ARRAY_SIZE(soc_list), &num_clusters, &cores_per_cluster); 69*9df5ba05SJiafei Pan 70*9df5ba05SJiafei Pan /* 71*9df5ba05SJiafei Pan * The highest level is the system level. The next level is constituted 72*9df5ba05SJiafei Pan * by clusters and then cores in clusters. 73*9df5ba05SJiafei Pan */ 74*9df5ba05SJiafei Pan _power_domain_tree_desc[0] = 1; 75*9df5ba05SJiafei Pan _power_domain_tree_desc[1] = num_clusters; 76*9df5ba05SJiafei Pan 77*9df5ba05SJiafei Pan for (i = 0; i < _power_domain_tree_desc[1]; i++) { 78*9df5ba05SJiafei Pan _power_domain_tree_desc[i + 2] = cores_per_cluster; 79*9df5ba05SJiafei Pan } 80*9df5ba05SJiafei Pan 81*9df5ba05SJiafei Pan 82*9df5ba05SJiafei Pan return _power_domain_tree_desc; 83*9df5ba05SJiafei Pan } 84*9df5ba05SJiafei Pan 85*9df5ba05SJiafei Pan CASSERT(NUMBER_OF_CLUSTERS && NUMBER_OF_CLUSTERS <= 256, 86*9df5ba05SJiafei Pan assert_invalid_ls1088a_cluster_count); 87*9df5ba05SJiafei Pan 88*9df5ba05SJiafei Pan /* 89*9df5ba05SJiafei Pan * This function returns the core count within the cluster corresponding to 90*9df5ba05SJiafei Pan * `mpidr`. 91*9df5ba05SJiafei Pan */ 92*9df5ba05SJiafei Pan unsigned int plat_ls_get_cluster_core_count(u_register_t mpidr) 93*9df5ba05SJiafei Pan { 94*9df5ba05SJiafei Pan return CORES_PER_CLUSTER; 95*9df5ba05SJiafei Pan } 96*9df5ba05SJiafei Pan 97*9df5ba05SJiafei Pan /* 98*9df5ba05SJiafei Pan * This function returns the total number of cores in the SoC 99*9df5ba05SJiafei Pan */ 100*9df5ba05SJiafei Pan unsigned int get_tot_num_cores(void) 101*9df5ba05SJiafei Pan { 102*9df5ba05SJiafei Pan uint8_t num_clusters, cores_per_cluster; 103*9df5ba05SJiafei Pan 104*9df5ba05SJiafei Pan get_cluster_info(soc_list, ARRAY_SIZE(soc_list), &num_clusters, &cores_per_cluster); 105*9df5ba05SJiafei Pan 106*9df5ba05SJiafei Pan return (num_clusters * cores_per_cluster); 107*9df5ba05SJiafei Pan } 108*9df5ba05SJiafei Pan 109*9df5ba05SJiafei Pan /* 110*9df5ba05SJiafei Pan * This function returns the PMU IDLE Cluster mask. 111*9df5ba05SJiafei Pan */ 112*9df5ba05SJiafei Pan unsigned int get_pmu_idle_cluster_mask(void) 113*9df5ba05SJiafei Pan { 114*9df5ba05SJiafei Pan uint8_t num_clusters, cores_per_cluster; 115*9df5ba05SJiafei Pan 116*9df5ba05SJiafei Pan get_cluster_info(soc_list, ARRAY_SIZE(soc_list), &num_clusters, &cores_per_cluster); 117*9df5ba05SJiafei Pan 118*9df5ba05SJiafei Pan return ((1 << num_clusters) - 2); 119*9df5ba05SJiafei Pan } 120*9df5ba05SJiafei Pan 121*9df5ba05SJiafei Pan /* 122*9df5ba05SJiafei Pan * This function returns the PMU Flush Cluster mask. 123*9df5ba05SJiafei Pan */ 124*9df5ba05SJiafei Pan unsigned int get_pmu_flush_cluster_mask(void) 125*9df5ba05SJiafei Pan { 126*9df5ba05SJiafei Pan uint8_t num_clusters, cores_per_cluster; 127*9df5ba05SJiafei Pan 128*9df5ba05SJiafei Pan get_cluster_info(soc_list, ARRAY_SIZE(soc_list), &num_clusters, &cores_per_cluster); 129*9df5ba05SJiafei Pan 130*9df5ba05SJiafei Pan return ((1 << num_clusters) - 2); 131*9df5ba05SJiafei Pan } 132*9df5ba05SJiafei Pan 133*9df5ba05SJiafei Pan /* 134*9df5ba05SJiafei Pan * This function returns the PMU IDLE Core mask. 135*9df5ba05SJiafei Pan */ 136*9df5ba05SJiafei Pan unsigned int get_pmu_idle_core_mask(void) 137*9df5ba05SJiafei Pan { 138*9df5ba05SJiafei Pan return ((1 << get_tot_num_cores()) - 2); 139*9df5ba05SJiafei Pan } 140*9df5ba05SJiafei Pan 141*9df5ba05SJiafei Pan #ifdef IMAGE_BL2 142*9df5ba05SJiafei Pan 143*9df5ba05SJiafei Pan void soc_bl2_prepare_exit(void) 144*9df5ba05SJiafei Pan { 145*9df5ba05SJiafei Pan #if defined(NXP_SFP_ENABLED) && defined(DISABLE_FUSE_WRITE) 146*9df5ba05SJiafei Pan set_sfp_wr_disable(); 147*9df5ba05SJiafei Pan #endif 148*9df5ba05SJiafei Pan } 149*9df5ba05SJiafei Pan 150*9df5ba05SJiafei Pan void soc_preload_setup(void) 151*9df5ba05SJiafei Pan { 152*9df5ba05SJiafei Pan 153*9df5ba05SJiafei Pan } 154*9df5ba05SJiafei Pan 155*9df5ba05SJiafei Pan /* 156*9df5ba05SJiafei Pan * This function returns the boot device based on RCW_SRC 157*9df5ba05SJiafei Pan */ 158*9df5ba05SJiafei Pan enum boot_device get_boot_dev(void) 159*9df5ba05SJiafei Pan { 160*9df5ba05SJiafei Pan enum boot_device src = BOOT_DEVICE_NONE; 161*9df5ba05SJiafei Pan uint32_t porsr1; 162*9df5ba05SJiafei Pan uint32_t rcw_src, val; 163*9df5ba05SJiafei Pan 164*9df5ba05SJiafei Pan porsr1 = read_reg_porsr1(); 165*9df5ba05SJiafei Pan 166*9df5ba05SJiafei Pan rcw_src = (porsr1 & PORSR1_RCW_MASK) >> PORSR1_RCW_SHIFT; 167*9df5ba05SJiafei Pan 168*9df5ba05SJiafei Pan /* RCW SRC NOR */ 169*9df5ba05SJiafei Pan val = rcw_src & RCW_SRC_TYPE_MASK; 170*9df5ba05SJiafei Pan if (val == NOR_16B_VAL) { 171*9df5ba05SJiafei Pan src = BOOT_DEVICE_IFC_NOR; 172*9df5ba05SJiafei Pan INFO("RCW BOOT SRC is IFC NOR\n"); 173*9df5ba05SJiafei Pan } else { 174*9df5ba05SJiafei Pan val = rcw_src & RCW_SRC_SERIAL_MASK; 175*9df5ba05SJiafei Pan switch (val) { 176*9df5ba05SJiafei Pan case QSPI_VAL: 177*9df5ba05SJiafei Pan src = BOOT_DEVICE_QSPI; 178*9df5ba05SJiafei Pan INFO("RCW BOOT SRC is QSPI\n"); 179*9df5ba05SJiafei Pan break; 180*9df5ba05SJiafei Pan case SDHC_VAL: 181*9df5ba05SJiafei Pan src = BOOT_DEVICE_EMMC; 182*9df5ba05SJiafei Pan INFO("RCW BOOT SRC is SD/EMMC\n"); 183*9df5ba05SJiafei Pan break; 184*9df5ba05SJiafei Pan case EMMC_VAL: 185*9df5ba05SJiafei Pan src = BOOT_DEVICE_EMMC; 186*9df5ba05SJiafei Pan INFO("RCW BOOT SRC is SD/EMMC\n"); 187*9df5ba05SJiafei Pan break; 188*9df5ba05SJiafei Pan default: 189*9df5ba05SJiafei Pan src = BOOT_DEVICE_NONE; 190*9df5ba05SJiafei Pan } 191*9df5ba05SJiafei Pan } 192*9df5ba05SJiafei Pan 193*9df5ba05SJiafei Pan return src; 194*9df5ba05SJiafei Pan } 195*9df5ba05SJiafei Pan 196*9df5ba05SJiafei Pan /* 197*9df5ba05SJiafei Pan * This function sets up access permissions on memory regions 198*9df5ba05SJiafei Pan */ 199*9df5ba05SJiafei Pan void soc_mem_access(void) 200*9df5ba05SJiafei Pan { 201*9df5ba05SJiafei Pan dram_regions_info_t *info_dram_regions = get_dram_regions_info(); 202*9df5ba05SJiafei Pan int i = 0; 203*9df5ba05SJiafei Pan struct tzc400_reg tzc400_reg_list[MAX_NUM_TZC_REGION]; 204*9df5ba05SJiafei Pan int dram_idx, index = 1; 205*9df5ba05SJiafei Pan 206*9df5ba05SJiafei Pan for (dram_idx = 0; dram_idx < info_dram_regions->num_dram_regions; 207*9df5ba05SJiafei Pan dram_idx++) { 208*9df5ba05SJiafei Pan if (info_dram_regions->region[i].size == 0) { 209*9df5ba05SJiafei Pan ERROR("DDR init failure, or"); 210*9df5ba05SJiafei Pan ERROR("DRAM regions not populated correctly.\n"); 211*9df5ba05SJiafei Pan break; 212*9df5ba05SJiafei Pan } 213*9df5ba05SJiafei Pan 214*9df5ba05SJiafei Pan index = populate_tzc400_reg_list(tzc400_reg_list, 215*9df5ba05SJiafei Pan dram_idx, index, 216*9df5ba05SJiafei Pan info_dram_regions->region[dram_idx].addr, 217*9df5ba05SJiafei Pan info_dram_regions->region[dram_idx].size, 218*9df5ba05SJiafei Pan NXP_SECURE_DRAM_SIZE, NXP_SP_SHRD_DRAM_SIZE); 219*9df5ba05SJiafei Pan } 220*9df5ba05SJiafei Pan 221*9df5ba05SJiafei Pan mem_access_setup(NXP_TZC_ADDR, index, 222*9df5ba05SJiafei Pan tzc400_reg_list); 223*9df5ba05SJiafei Pan } 224*9df5ba05SJiafei Pan 225*9df5ba05SJiafei Pan /* 226*9df5ba05SJiafei Pan * This function implements soc specific erratum 227*9df5ba05SJiafei Pan * This is called before DDR is initialized or MMU is enabled 228*9df5ba05SJiafei Pan */ 229*9df5ba05SJiafei Pan void soc_early_init(void) 230*9df5ba05SJiafei Pan { 231*9df5ba05SJiafei Pan enum boot_device dev; 232*9df5ba05SJiafei Pan dram_regions_info_t *dram_regions_info = get_dram_regions_info(); 233*9df5ba05SJiafei Pan 234*9df5ba05SJiafei Pan #ifdef CONFIG_OCRAM_ECC_EN 235*9df5ba05SJiafei Pan ocram_init(NXP_OCRAM_ADDR, NXP_OCRAM_SIZE); 236*9df5ba05SJiafei Pan #endif 237*9df5ba05SJiafei Pan dcfg_init(&dcfg_init_data); 238*9df5ba05SJiafei Pan #if LOG_LEVEL > 0 239*9df5ba05SJiafei Pan /* Initialize the console to provide early debug support */ 240*9df5ba05SJiafei Pan plat_console_init(NXP_CONSOLE_ADDR, 241*9df5ba05SJiafei Pan NXP_UART_CLK_DIVIDER, NXP_CONSOLE_BAUDRATE); 242*9df5ba05SJiafei Pan #endif 243*9df5ba05SJiafei Pan enable_timer_base_to_cluster(NXP_PMU_ADDR); 244*9df5ba05SJiafei Pan enable_core_tb(NXP_PMU_ADDR); 245*9df5ba05SJiafei Pan 246*9df5ba05SJiafei Pan /* 247*9df5ba05SJiafei Pan * Use the region(NXP_SD_BLOCK_BUF_ADDR + NXP_SD_BLOCK_BUF_SIZE) 248*9df5ba05SJiafei Pan * as dma of sd 249*9df5ba05SJiafei Pan */ 250*9df5ba05SJiafei Pan dev = get_boot_dev(); 251*9df5ba05SJiafei Pan if (dev == BOOT_DEVICE_EMMC) { 252*9df5ba05SJiafei Pan mmap_add_region(NXP_SD_BLOCK_BUF_ADDR, NXP_SD_BLOCK_BUF_ADDR, 253*9df5ba05SJiafei Pan NXP_SD_BLOCK_BUF_SIZE, 254*9df5ba05SJiafei Pan MT_DEVICE | MT_RW | MT_NS); 255*9df5ba05SJiafei Pan } 256*9df5ba05SJiafei Pan 257*9df5ba05SJiafei Pan #if TRUSTED_BOARD_BOOT 258*9df5ba05SJiafei Pan uint32_t mode; 259*9df5ba05SJiafei Pan 260*9df5ba05SJiafei Pan sfp_init(NXP_SFP_ADDR); 261*9df5ba05SJiafei Pan /* 262*9df5ba05SJiafei Pan * For secure boot disable SMMU. 263*9df5ba05SJiafei Pan * Later when platform security policy comes in picture, 264*9df5ba05SJiafei Pan * this might get modified based on the policy 265*9df5ba05SJiafei Pan */ 266*9df5ba05SJiafei Pan if (check_boot_mode_secure(&mode) == true) { 267*9df5ba05SJiafei Pan bypass_smmu(NXP_SMMU_ADDR); 268*9df5ba05SJiafei Pan } 269*9df5ba05SJiafei Pan 270*9df5ba05SJiafei Pan /* 271*9df5ba05SJiafei Pan * For Mbedtls currently crypto is not supported via CAAM 272*9df5ba05SJiafei Pan * enable it when that support is there. In tbbr.mk 273*9df5ba05SJiafei Pan * the CAAM_INTEG is set as 0. 274*9df5ba05SJiafei Pan */ 275*9df5ba05SJiafei Pan #ifndef MBEDTLS_X509 276*9df5ba05SJiafei Pan /* Initialize the crypto accelerator if enabled */ 277*9df5ba05SJiafei Pan if (is_sec_enabled() == false) { 278*9df5ba05SJiafei Pan INFO("SEC is disabled.\n"); 279*9df5ba05SJiafei Pan } else { 280*9df5ba05SJiafei Pan sec_init(NXP_CAAM_ADDR); 281*9df5ba05SJiafei Pan } 282*9df5ba05SJiafei Pan #endif 283*9df5ba05SJiafei Pan #endif 284*9df5ba05SJiafei Pan 285*9df5ba05SJiafei Pan soc_errata(); 286*9df5ba05SJiafei Pan 287*9df5ba05SJiafei Pan delay_timer_init(NXP_TIMER_ADDR); 288*9df5ba05SJiafei Pan i2c_init(NXP_I2C_ADDR); 289*9df5ba05SJiafei Pan dram_regions_info->total_dram_size = init_ddr(); 290*9df5ba05SJiafei Pan } 291*9df5ba05SJiafei Pan #else /* !IMAGE_BL2 */ 292*9df5ba05SJiafei Pan 293*9df5ba05SJiafei Pan void soc_early_platform_setup2(void) 294*9df5ba05SJiafei Pan { 295*9df5ba05SJiafei Pan dcfg_init(&dcfg_init_data); 296*9df5ba05SJiafei Pan /* 297*9df5ba05SJiafei Pan * Initialize system level generic timer for Socs 298*9df5ba05SJiafei Pan */ 299*9df5ba05SJiafei Pan delay_timer_init(NXP_TIMER_ADDR); 300*9df5ba05SJiafei Pan 301*9df5ba05SJiafei Pan #if LOG_LEVEL > 0 302*9df5ba05SJiafei Pan /* Initialize the console to provide early debug support */ 303*9df5ba05SJiafei Pan plat_console_init(NXP_CONSOLE_ADDR, 304*9df5ba05SJiafei Pan NXP_UART_CLK_DIVIDER, NXP_CONSOLE_BAUDRATE); 305*9df5ba05SJiafei Pan #endif 306*9df5ba05SJiafei Pan } 307*9df5ba05SJiafei Pan 308*9df5ba05SJiafei Pan void soc_platform_setup(void) 309*9df5ba05SJiafei Pan { 310*9df5ba05SJiafei Pan /* Initialize the GIC driver, cpu and distributor interfaces */ 311*9df5ba05SJiafei Pan static uintptr_t target_mask_array[PLATFORM_CORE_COUNT]; 312*9df5ba05SJiafei Pan static interrupt_prop_t ls_interrupt_props[] = { 313*9df5ba05SJiafei Pan PLAT_LS_G1S_IRQ_PROPS(INTR_GROUP1S), 314*9df5ba05SJiafei Pan PLAT_LS_G0_IRQ_PROPS(INTR_GROUP0) 315*9df5ba05SJiafei Pan }; 316*9df5ba05SJiafei Pan 317*9df5ba05SJiafei Pan plat_ls_gic_driver_init(NXP_GICD_ADDR, NXP_GICR_ADDR, 318*9df5ba05SJiafei Pan PLATFORM_CORE_COUNT, 319*9df5ba05SJiafei Pan ls_interrupt_props, 320*9df5ba05SJiafei Pan ARRAY_SIZE(ls_interrupt_props), 321*9df5ba05SJiafei Pan target_mask_array, 322*9df5ba05SJiafei Pan plat_core_pos); 323*9df5ba05SJiafei Pan 324*9df5ba05SJiafei Pan plat_ls_gic_init(); 325*9df5ba05SJiafei Pan enable_init_timer(); 326*9df5ba05SJiafei Pan } 327*9df5ba05SJiafei Pan 328*9df5ba05SJiafei Pan /* 329*9df5ba05SJiafei Pan * This function initializes the soc from the BL31 module 330*9df5ba05SJiafei Pan */ 331*9df5ba05SJiafei Pan void soc_init(void) 332*9df5ba05SJiafei Pan { 333*9df5ba05SJiafei Pan uint8_t num_clusters, cores_per_cluster; 334*9df5ba05SJiafei Pan 335*9df5ba05SJiafei Pan /* low-level init of the soc */ 336*9df5ba05SJiafei Pan soc_init_lowlevel(); 337*9df5ba05SJiafei Pan _init_global_data(); 338*9df5ba05SJiafei Pan soc_init_percpu(); 339*9df5ba05SJiafei Pan _initialize_psci(); 340*9df5ba05SJiafei Pan 341*9df5ba05SJiafei Pan /* 342*9df5ba05SJiafei Pan * Initialize Interconnect for this cluster during cold boot. 343*9df5ba05SJiafei Pan * No need for locks as no other CPU is active. 344*9df5ba05SJiafei Pan */ 345*9df5ba05SJiafei Pan cci_init(NXP_CCI_ADDR, cci_map, ARRAY_SIZE(cci_map)); 346*9df5ba05SJiafei Pan 347*9df5ba05SJiafei Pan /* 348*9df5ba05SJiafei Pan * Enable Interconnect coherency for the primary CPU's cluster. 349*9df5ba05SJiafei Pan */ 350*9df5ba05SJiafei Pan get_cluster_info(soc_list, ARRAY_SIZE(soc_list), &num_clusters, &cores_per_cluster); 351*9df5ba05SJiafei Pan plat_ls_interconnect_enter_coherency(num_clusters); 352*9df5ba05SJiafei Pan 353*9df5ba05SJiafei Pan /* set platform security policies */ 354*9df5ba05SJiafei Pan _set_platform_security(); 355*9df5ba05SJiafei Pan 356*9df5ba05SJiafei Pan /* Initialize the crypto accelerator if enabled */ 357*9df5ba05SJiafei Pan if (is_sec_enabled() == false) { 358*9df5ba05SJiafei Pan INFO("SEC is disabled.\n"); 359*9df5ba05SJiafei Pan } else { 360*9df5ba05SJiafei Pan sec_init(NXP_CAAM_ADDR); 361*9df5ba05SJiafei Pan } 362*9df5ba05SJiafei Pan } 363*9df5ba05SJiafei Pan 364*9df5ba05SJiafei Pan void soc_runtime_setup(void) 365*9df5ba05SJiafei Pan { 366*9df5ba05SJiafei Pan 367*9df5ba05SJiafei Pan } 368*9df5ba05SJiafei Pan #endif /* IMAGE_BL2 */ 369*9df5ba05SJiafei Pan 370*9df5ba05SJiafei Pan /* 371*9df5ba05SJiafei Pan * Function to return the SoC SYS CLK 372*9df5ba05SJiafei Pan */ 373*9df5ba05SJiafei Pan unsigned int get_sys_clk(void) 374*9df5ba05SJiafei Pan { 375*9df5ba05SJiafei Pan return NXP_SYSCLK_FREQ; 376*9df5ba05SJiafei Pan } 377*9df5ba05SJiafei Pan 378*9df5ba05SJiafei Pan /* 379*9df5ba05SJiafei Pan * Function returns the base counter frequency 380*9df5ba05SJiafei Pan * after reading the first entry at CNTFID0 (0x20 offset). 381*9df5ba05SJiafei Pan * 382*9df5ba05SJiafei Pan * Function is used by: 383*9df5ba05SJiafei Pan * 1. ARM common code for PSCI management. 384*9df5ba05SJiafei Pan * 2. ARM Generic Timer init. 385*9df5ba05SJiafei Pan */ 386*9df5ba05SJiafei Pan unsigned int plat_get_syscnt_freq2(void) 387*9df5ba05SJiafei Pan { 388*9df5ba05SJiafei Pan unsigned int counter_base_frequency; 389*9df5ba05SJiafei Pan /* 390*9df5ba05SJiafei Pan * Below register specifies the base frequency of the system counter. 391*9df5ba05SJiafei Pan * As per NXP Board Manuals: 392*9df5ba05SJiafei Pan * The system counter always works with SYS_REF_CLK/4 frequency clock. 393*9df5ba05SJiafei Pan */ 394*9df5ba05SJiafei Pan counter_base_frequency = mmio_read_32(NXP_TIMER_ADDR + CNTFID_OFF); 395*9df5ba05SJiafei Pan 396*9df5ba05SJiafei Pan return counter_base_frequency; 397*9df5ba05SJiafei Pan } 398