xref: /rk3399_ARM-atf/plat/nxp/soc-ls1088a/soc.c (revision 9df5ba05b4fe4cd44157363a897b73553ba6e2f1)
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