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