xref: /openbmc/u-boot/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S (revision d94604d558cda9f89722c967d6f8d6269a2db21c)
183d290c5STom Rini/* SPDX-License-Identifier: GPL-2.0+ */
29f3183d2SMingkai Hu/*
39f3183d2SMingkai Hu * (C) Copyright 2014-2015 Freescale Semiconductor
49f3183d2SMingkai Hu *
59f3183d2SMingkai Hu * Extracted from armv8/start.S
69f3183d2SMingkai Hu */
79f3183d2SMingkai Hu
89f3183d2SMingkai Hu#include <config.h>
99f3183d2SMingkai Hu#include <linux/linkage.h>
109f3183d2SMingkai Hu#include <asm/gic.h>
119f3183d2SMingkai Hu#include <asm/macro.h>
12fa18ed76SWenbin Song#include <asm/arch-fsl-layerscape/soc.h>
139f3183d2SMingkai Hu#ifdef CONFIG_MP
149f3183d2SMingkai Hu#include <asm/arch/mp.h>
159f3183d2SMingkai Hu#endif
16f6a70b3aSPriyanka Jain#ifdef CONFIG_FSL_LSCH3
17f6a70b3aSPriyanka Jain#include <asm/arch-fsl-layerscape/immap_lsch3.h>
18f6a70b3aSPriyanka Jain#endif
19ec6617c3SAlison Wang#include <asm/u-boot.h>
209f3183d2SMingkai Hu
21fa18ed76SWenbin Song/* Get GIC offset
22fa18ed76SWenbin Song* For LS1043a rev1.0, GIC base address align with 4k.
23fa18ed76SWenbin Song* For LS1043a rev1.1, if DCFG_GIC400_ALIGN[GIC_ADDR_BIT]
24fa18ed76SWenbin Song* is set, GIC base address align with 4K, or else align
25fa18ed76SWenbin Song* with 64k.
26fa18ed76SWenbin Song* output:
27fa18ed76SWenbin Song*	x0: the base address of GICD
28fa18ed76SWenbin Song*	x1: the base address of GICC
29fa18ed76SWenbin Song*/
30fa18ed76SWenbin SongENTRY(get_gic_offset)
31fa18ed76SWenbin Song	ldr     x0, =GICD_BASE
32fa18ed76SWenbin Song#ifdef CONFIG_GICV2
33fa18ed76SWenbin Song	ldr     x1, =GICC_BASE
34fa18ed76SWenbin Song#endif
35fa18ed76SWenbin Song#ifdef CONFIG_HAS_FEATURE_GIC64K_ALIGN
36fa18ed76SWenbin Song	ldr     x2, =DCFG_CCSR_SVR
37fa18ed76SWenbin Song	ldr	w2, [x2]
38fa18ed76SWenbin Song	rev	w2, w2
39a8f33034SWenbin song	lsr	w3, w2, #16
40a8f33034SWenbin song	ldr	w4, =SVR_DEV(SVR_LS1043A)
41fa18ed76SWenbin Song	cmp	w3, w4
42fa18ed76SWenbin Song	b.ne	1f
43fa18ed76SWenbin Song	ands	w2, w2, #0xff
44fa18ed76SWenbin Song	cmp	w2, #REV1_0
45fa18ed76SWenbin Song	b.eq	1f
46fa18ed76SWenbin Song	ldr	x2, =SCFG_GIC400_ALIGN
47fa18ed76SWenbin Song	ldr	w2, [x2]
48fa18ed76SWenbin Song	rev	w2, w2
49fa18ed76SWenbin Song	tbnz	w2, #GIC_ADDR_BIT, 1f
50fa18ed76SWenbin Song	ldr     x0, =GICD_BASE_64K
51fa18ed76SWenbin Song#ifdef CONFIG_GICV2
52fa18ed76SWenbin Song	ldr     x1, =GICC_BASE_64K
53fa18ed76SWenbin Song#endif
54fa18ed76SWenbin Song1:
55fa18ed76SWenbin Song#endif
56fa18ed76SWenbin Song	ret
57fa18ed76SWenbin SongENDPROC(get_gic_offset)
58fa18ed76SWenbin Song
59fa18ed76SWenbin SongENTRY(smp_kick_all_cpus)
60fa18ed76SWenbin Song	/* Kick secondary cpus up by SGI 0 interrupt */
61fa18ed76SWenbin Song#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
62fa18ed76SWenbin Song	mov	x29, lr			/* Save LR */
63fa18ed76SWenbin Song	bl	get_gic_offset
64fa18ed76SWenbin Song	bl	gic_kick_secondary_cpus
65fa18ed76SWenbin Song	mov	lr, x29			/* Restore LR */
66fa18ed76SWenbin Song#endif
67fa18ed76SWenbin Song	ret
68fa18ed76SWenbin SongENDPROC(smp_kick_all_cpus)
69fa18ed76SWenbin Song
70fa18ed76SWenbin Song
719f3183d2SMingkai HuENTRY(lowlevel_init)
729f3183d2SMingkai Hu	mov	x29, lr			/* Save LR */
739f3183d2SMingkai Hu
74bb50569dSYork Sun	/* unmask SError and abort */
75bb50569dSYork Sun	msr daifclr, #4
76bb50569dSYork Sun
77bb50569dSYork Sun	/* Set HCR_EL2[AMO] so SError @EL2 is taken */
78bb50569dSYork Sun	mrs	x0, hcr_el2
79bb50569dSYork Sun	orr	x0, x0, #0x20			/* AMO */
80bb50569dSYork Sun	msr	hcr_el2, x0
81bb50569dSYork Sun	isb
82bb50569dSYork Sun
83399e2bb6SYork Sun	switch_el x1, 1f, 100f, 100f	/* skip if not in EL3 */
84399e2bb6SYork Sun1:
85399e2bb6SYork Sun
86c055cee1SAshish Kumar#if defined (CONFIG_SYS_FSL_HAS_CCN504)
872b690b98SPrabhakar Kushwaha
882b690b98SPrabhakar Kushwaha	/* Set Wuo bit for RN-I 20 */
894a3ab193SYork Sun#ifdef CONFIG_ARCH_LS2080A
902b690b98SPrabhakar Kushwaha	ldr	x0, =CCI_AUX_CONTROL_BASE(20)
912b690b98SPrabhakar Kushwaha	ldr	x1, =0x00000010
922b690b98SPrabhakar Kushwaha	bl	ccn504_set_aux
93d037261fSPriyanka Jain
94d037261fSPriyanka Jain	/*
95d037261fSPriyanka Jain	 * Set forced-order mode in RNI-6, RNI-20
96d037261fSPriyanka Jain	 * This is required for performance optimization on LS2088A
97d037261fSPriyanka Jain	 * LS2080A family does not support setting forced-order mode,
98d037261fSPriyanka Jain	 * so skip this operation for LS2080A family
99d037261fSPriyanka Jain	 */
100d037261fSPriyanka Jain	bl	get_svr
101d037261fSPriyanka Jain	lsr	w0, w0, #16
102a8f33034SWenbin song	ldr	w1, =SVR_DEV(SVR_LS2080A)
103d037261fSPriyanka Jain	cmp	w0, w1
104d037261fSPriyanka Jain	b.eq	1f
105d037261fSPriyanka Jain
106d037261fSPriyanka Jain	ldr	x0, =CCI_AUX_CONTROL_BASE(6)
107d037261fSPriyanka Jain	ldr	x1, =0x00000020
108d037261fSPriyanka Jain	bl	ccn504_set_aux
109d037261fSPriyanka Jain	ldr	x0, =CCI_AUX_CONTROL_BASE(20)
110d037261fSPriyanka Jain	ldr	x1, =0x00000020
111d037261fSPriyanka Jain	bl	ccn504_set_aux
112d037261fSPriyanka Jain1:
1132b690b98SPrabhakar Kushwaha#endif
1142b690b98SPrabhakar Kushwaha
1159f3183d2SMingkai Hu	/* Add fully-coherent masters to DVM domain */
1169f3183d2SMingkai Hu	ldr	x0, =CCI_MN_BASE
1179f3183d2SMingkai Hu	ldr	x1, =CCI_MN_RNF_NODEID_LIST
1189f3183d2SMingkai Hu	ldr	x2, =CCI_MN_DVM_DOMAIN_CTL_SET
1199f3183d2SMingkai Hu	bl	ccn504_add_masters_to_dvm
1209f3183d2SMingkai Hu
1219f3183d2SMingkai Hu	/* Set all RN-I ports to QoS of 15 */
1229f3183d2SMingkai Hu	ldr	x0, =CCI_S0_QOS_CONTROL_BASE(0)
1239f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1249f3183d2SMingkai Hu	bl	ccn504_set_qos
1259f3183d2SMingkai Hu	ldr	x0, =CCI_S1_QOS_CONTROL_BASE(0)
1269f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1279f3183d2SMingkai Hu	bl	ccn504_set_qos
1289f3183d2SMingkai Hu	ldr	x0, =CCI_S2_QOS_CONTROL_BASE(0)
1299f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1309f3183d2SMingkai Hu	bl	ccn504_set_qos
1319f3183d2SMingkai Hu
1329f3183d2SMingkai Hu	ldr	x0, =CCI_S0_QOS_CONTROL_BASE(2)
1339f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1349f3183d2SMingkai Hu	bl	ccn504_set_qos
1359f3183d2SMingkai Hu	ldr	x0, =CCI_S1_QOS_CONTROL_BASE(2)
1369f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1379f3183d2SMingkai Hu	bl	ccn504_set_qos
1389f3183d2SMingkai Hu	ldr	x0, =CCI_S2_QOS_CONTROL_BASE(2)
1399f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1409f3183d2SMingkai Hu	bl	ccn504_set_qos
1419f3183d2SMingkai Hu
1429f3183d2SMingkai Hu	ldr	x0, =CCI_S0_QOS_CONTROL_BASE(6)
1439f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1449f3183d2SMingkai Hu	bl	ccn504_set_qos
1459f3183d2SMingkai Hu	ldr	x0, =CCI_S1_QOS_CONTROL_BASE(6)
1469f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1479f3183d2SMingkai Hu	bl	ccn504_set_qos
1489f3183d2SMingkai Hu	ldr	x0, =CCI_S2_QOS_CONTROL_BASE(6)
1499f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1509f3183d2SMingkai Hu	bl	ccn504_set_qos
1519f3183d2SMingkai Hu
1529f3183d2SMingkai Hu	ldr	x0, =CCI_S0_QOS_CONTROL_BASE(12)
1539f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1549f3183d2SMingkai Hu	bl	ccn504_set_qos
1559f3183d2SMingkai Hu	ldr	x0, =CCI_S1_QOS_CONTROL_BASE(12)
1569f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1579f3183d2SMingkai Hu	bl	ccn504_set_qos
1589f3183d2SMingkai Hu	ldr	x0, =CCI_S2_QOS_CONTROL_BASE(12)
1599f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1609f3183d2SMingkai Hu	bl	ccn504_set_qos
1619f3183d2SMingkai Hu
1629f3183d2SMingkai Hu	ldr	x0, =CCI_S0_QOS_CONTROL_BASE(16)
1639f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1649f3183d2SMingkai Hu	bl	ccn504_set_qos
1659f3183d2SMingkai Hu	ldr	x0, =CCI_S1_QOS_CONTROL_BASE(16)
1669f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1679f3183d2SMingkai Hu	bl	ccn504_set_qos
1689f3183d2SMingkai Hu	ldr	x0, =CCI_S2_QOS_CONTROL_BASE(16)
1699f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1709f3183d2SMingkai Hu	bl	ccn504_set_qos
1719f3183d2SMingkai Hu
1729f3183d2SMingkai Hu	ldr	x0, =CCI_S0_QOS_CONTROL_BASE(20)
1739f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1749f3183d2SMingkai Hu	bl	ccn504_set_qos
1759f3183d2SMingkai Hu	ldr	x0, =CCI_S1_QOS_CONTROL_BASE(20)
1769f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1779f3183d2SMingkai Hu	bl	ccn504_set_qos
1789f3183d2SMingkai Hu	ldr	x0, =CCI_S2_QOS_CONTROL_BASE(20)
1799f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1809f3183d2SMingkai Hu	bl	ccn504_set_qos
181c055cee1SAshish Kumar#endif /* CONFIG_SYS_FSL_HAS_CCN504 */
1829f3183d2SMingkai Hu
1831e49a231SPrabhakar Kushwaha#ifdef SMMU_BASE
1849f3183d2SMingkai Hu	/* Set the SMMU page size in the sACR register */
1859f3183d2SMingkai Hu	ldr	x1, =SMMU_BASE
1869f3183d2SMingkai Hu	ldr	w0, [x1, #0x10]
1879f3183d2SMingkai Hu	orr	w0, w0, #1 << 16  /* set sACR.pagesize to indicate 64K page */
1889f3183d2SMingkai Hu	str	w0, [x1, #0x10]
1891e49a231SPrabhakar Kushwaha#endif
1909f3183d2SMingkai Hu
1919f3183d2SMingkai Hu	/* Initialize GIC Secure Bank Status */
1929f3183d2SMingkai Hu#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
1939f3183d2SMingkai Hu	branch_if_slave x0, 1f
194fa18ed76SWenbin Song	bl	get_gic_offset
1959f3183d2SMingkai Hu	bl	gic_init_secure
1969f3183d2SMingkai Hu1:
1979f3183d2SMingkai Hu#ifdef CONFIG_GICV3
1989f3183d2SMingkai Hu	ldr	x0, =GICR_BASE
1999f3183d2SMingkai Hu	bl	gic_init_secure_percpu
2009f3183d2SMingkai Hu#elif defined(CONFIG_GICV2)
201fa18ed76SWenbin Song	bl	get_gic_offset
2029f3183d2SMingkai Hu	bl	gic_init_secure_percpu
2039f3183d2SMingkai Hu#endif
2049f3183d2SMingkai Hu#endif
2059f3183d2SMingkai Hu
206399e2bb6SYork Sun100:
2079f3183d2SMingkai Hu	branch_if_master x0, x1, 2f
2089f3183d2SMingkai Hu
2099f3183d2SMingkai Hu#if defined(CONFIG_MP) && defined(CONFIG_ARMV8_MULTIENTRY)
2109f3183d2SMingkai Hu	ldr	x0, =secondary_boot_func
2119f3183d2SMingkai Hu	blr	x0
2129f3183d2SMingkai Hu#endif
2139f3183d2SMingkai Hu
2149f3183d2SMingkai Hu2:
215399e2bb6SYork Sun	switch_el x1, 1f, 100f, 100f	/* skip if not in EL3 */
216399e2bb6SYork Sun1:
2179f3183d2SMingkai Hu#ifdef CONFIG_FSL_TZPC_BP147
2189f3183d2SMingkai Hu	/* Set Non Secure access for all devices protected via TZPC */
2199f3183d2SMingkai Hu	ldr	x1, =TZPCDECPROT_0_SET_BASE /* Decode Protection-0 Set Reg */
2209f3183d2SMingkai Hu	orr	w0, w0, #1 << 3 /* DCFG_RESET is accessible from NS world */
2219f3183d2SMingkai Hu	str	w0, [x1]
2229f3183d2SMingkai Hu
2239f3183d2SMingkai Hu	isb
2249f3183d2SMingkai Hu	dsb	sy
2259f3183d2SMingkai Hu#endif
2269f3183d2SMingkai Hu
2279f3183d2SMingkai Hu#ifdef CONFIG_FSL_TZASC_400
228d5df606dSPriyanka Jain	/*
229d5df606dSPriyanka Jain	 * LS2080 and its personalities does not support TZASC
230d5df606dSPriyanka Jain	 * So skip TZASC related operations
231d5df606dSPriyanka Jain	 */
232d5df606dSPriyanka Jain	bl	get_svr
233d5df606dSPriyanka Jain	lsr	w0, w0, #16
234a8f33034SWenbin song	ldr	w1, =SVR_DEV(SVR_LS2080A)
235d5df606dSPriyanka Jain	cmp	w0, w1
236d5df606dSPriyanka Jain	b.eq	1f
237d5df606dSPriyanka Jain
2389f3183d2SMingkai Hu	/* Set TZASC so that:
2399f3183d2SMingkai Hu	 * a. We use only Region0 whose global secure write/read is EN
2409f3183d2SMingkai Hu	 * b. We use only Region0 whose NSAID write/read is EN
2419f3183d2SMingkai Hu	 *
2429f3183d2SMingkai Hu	 * NOTE: As per the CCSR map doc, TZASC 3 and TZASC 4 are just
2439f3183d2SMingkai Hu	 * 	 placeholders.
2449f3183d2SMingkai Hu	 */
245bda33d3cSSriram Dash
246bda33d3cSSriram Dash.macro tzasc_prog, xreg
247bda33d3cSSriram Dash
248bda33d3cSSriram Dash	mov     x12, TZASC1_BASE
249bda33d3cSSriram Dash	mov     x16, #0x10000
250bda33d3cSSriram Dash	mul     x14, \xreg, x16
251bda33d3cSSriram Dash	add     x14, x14,x12
252bda33d3cSSriram Dash	mov 	x1, #0x8
253bda33d3cSSriram Dash	add     x1, x1, x14
254bda33d3cSSriram Dash
2557cfbb4abSPriyanka Jain	ldr     w0, [x1]		/* Filter 0 Gate Keeper Register */
2567cfbb4abSPriyanka Jain	orr     w0, w0, #1 << 0		/* Set open_request for Filter 0 */
2577cfbb4abSPriyanka Jain	str     w0, [x1]
2589f3183d2SMingkai Hu
259bda33d3cSSriram Dash	mov	x1, #0x110
260bda33d3cSSriram Dash	add     x1, x1, x14
261bda33d3cSSriram Dash
2627cfbb4abSPriyanka Jain	ldr     w0, [x1]		/* Region-0 Attributes Register */
2637cfbb4abSPriyanka Jain	orr     w0, w0, #1 << 31	/* Set Sec global write en, Bit[31] */
2647cfbb4abSPriyanka Jain	orr     w0, w0, #1 << 30	/* Set Sec global read en, Bit[30] */
2657cfbb4abSPriyanka Jain	str     w0, [x1]
2669f3183d2SMingkai Hu
267bda33d3cSSriram Dash	mov	x1, #0x114
268bda33d3cSSriram Dash	add     x1, x1, x14
269bda33d3cSSriram Dash
27085a9a14eSAshish kumar	ldr     w0, [x1]		/* Region-0 Access Register */
27185a9a14eSAshish kumar	mov     w0, #0xFFFFFFFF		/* Set nsaid_wr_en and nsaid_rd_en */
27285a9a14eSAshish kumar	str     w0, [x1]
273bda33d3cSSriram Dash.endm
274bda33d3cSSriram Dash
275bda33d3cSSriram Dash#ifdef CONFIG_FSL_TZASC_1
276bda33d3cSSriram Dash	mov     x13, #0
277bda33d3cSSriram Dash	tzasc_prog	x13
278bda33d3cSSriram Dash
27985a9a14eSAshish kumar#endif
28085a9a14eSAshish kumar#ifdef CONFIG_FSL_TZASC_2
281bda33d3cSSriram Dash	mov     x13, #1
282bda33d3cSSriram Dash	tzasc_prog	x13
28385a9a14eSAshish kumar
28485a9a14eSAshish kumar#endif
2859f3183d2SMingkai Hu	isb
2869f3183d2SMingkai Hu	dsb	sy
2879f3183d2SMingkai Hu#endif
288399e2bb6SYork Sun100:
289d5df606dSPriyanka Jain1:
290da28e58aSYork Sun#ifdef CONFIG_ARCH_LS1046A
291399e2bb6SYork Sun	switch_el x1, 1f, 100f, 100f	/* skip if not in EL3 */
292399e2bb6SYork Sun1:
29313f79880SMingkai Hu	/* Initialize the L2 RAM latency */
29413f79880SMingkai Hu	mrs   x1, S3_1_c11_c0_2
29513f79880SMingkai Hu	mov   x0, #0x1C7
29613f79880SMingkai Hu	/* Clear L2 Tag RAM latency and L2 Data RAM latency */
29713f79880SMingkai Hu	bic   x1, x1, x0
29813f79880SMingkai Hu	/* Set L2 data ram latency bits [2:0] */
29913f79880SMingkai Hu	orr   x1, x1, #0x2
30013f79880SMingkai Hu	/* set L2 tag ram latency bits [8:6] */
30113f79880SMingkai Hu	orr   x1,  x1, #0x80
30213f79880SMingkai Hu	msr   S3_1_c11_c0_2, x1
30313f79880SMingkai Hu	isb
304399e2bb6SYork Sun100:
30513f79880SMingkai Hu#endif
30613f79880SMingkai Hu
3075a73ec61SRajesh Bhagat#if !defined(CONFIG_TFABOOT) && \
3085a73ec61SRajesh Bhagat	(defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD))
3093b6bf811SHou Zhiqiang	bl	fsl_ocram_init
3103b6bf811SHou Zhiqiang#endif
3113b6bf811SHou Zhiqiang
3129f3183d2SMingkai Hu	mov	lr, x29			/* Restore LR */
3139f3183d2SMingkai Hu	ret
3149f3183d2SMingkai HuENDPROC(lowlevel_init)
3159f3183d2SMingkai Hu
3163b6bf811SHou Zhiqiang#if defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD)
3173b6bf811SHou ZhiqiangENTRY(fsl_ocram_init)
3183b6bf811SHou Zhiqiang	mov	x28, lr			/* Save LR */
3193b6bf811SHou Zhiqiang	bl	fsl_clear_ocram
3203b6bf811SHou Zhiqiang	bl	fsl_ocram_clear_ecc_err
3213b6bf811SHou Zhiqiang	mov	lr, x28			/* Restore LR */
3223b6bf811SHou Zhiqiang	ret
3233b6bf811SHou ZhiqiangENDPROC(fsl_ocram_init)
3243b6bf811SHou Zhiqiang
3253b6bf811SHou ZhiqiangENTRY(fsl_clear_ocram)
3263b6bf811SHou Zhiqiang/* Clear OCRAM */
3273b6bf811SHou Zhiqiang	ldr	x0, =CONFIG_SYS_FSL_OCRAM_BASE
3283b6bf811SHou Zhiqiang	ldr	x1, =(CONFIG_SYS_FSL_OCRAM_BASE + CONFIG_SYS_FSL_OCRAM_SIZE)
3293b6bf811SHou Zhiqiang	mov	x2, #0
3303b6bf811SHou Zhiqiangclear_loop:
3313b6bf811SHou Zhiqiang	str	x2, [x0]
3323b6bf811SHou Zhiqiang	add	x0, x0, #8
3333b6bf811SHou Zhiqiang	cmp	x0, x1
3343b6bf811SHou Zhiqiang	b.lo	clear_loop
3353b6bf811SHou Zhiqiang	ret
3363b6bf811SHou ZhiqiangENDPROC(fsl_clear_ocram)
3373b6bf811SHou Zhiqiang
3383b6bf811SHou ZhiqiangENTRY(fsl_ocram_clear_ecc_err)
3393b6bf811SHou Zhiqiang	/* OCRAM1/2 ECC status bit */
3403b6bf811SHou Zhiqiang	mov	w1, #0x60
3413b6bf811SHou Zhiqiang	ldr	x0, =DCSR_DCFG_SBEESR2
3423b6bf811SHou Zhiqiang	str	w1, [x0]
3433b6bf811SHou Zhiqiang	ldr	x0, =DCSR_DCFG_MBEESR2
3443b6bf811SHou Zhiqiang	str	w1, [x0]
3453b6bf811SHou Zhiqiang	ret
3463b6bf811SHou ZhiqiangENDPROC(fsl_ocram_init)
3473b6bf811SHou Zhiqiang#endif
3483b6bf811SHou Zhiqiang
349b7f2bbffSPrabhakar Kushwaha#ifdef CONFIG_FSL_LSCH3
350f6a70b3aSPriyanka Jain	.globl get_svr
351f6a70b3aSPriyanka Jainget_svr:
352f6a70b3aSPriyanka Jain	ldr	x1, =FSL_LSCH3_SVR
353f6a70b3aSPriyanka Jain	ldr	w0, [x1]
354f6a70b3aSPriyanka Jain	ret
355c055cee1SAshish Kumar#endif
356f6a70b3aSPriyanka Jain
357*4909b89eSPriyanka Jain#if defined(CONFIG_SYS_FSL_HAS_CCN504) || defined(CONFIG_SYS_FSL_HAS_CCN508)
3589f3183d2SMingkai Huhnf_pstate_poll:
3599f3183d2SMingkai Hu	/* x0 has the desired status, return 0 for success, 1 for timeout
3609f3183d2SMingkai Hu	 * clobber x1, x2, x3, x4, x6, x7
3619f3183d2SMingkai Hu	 */
3629f3183d2SMingkai Hu	mov	x1, x0
3639f3183d2SMingkai Hu	mov	x7, #0			/* flag for timeout */
3649f3183d2SMingkai Hu	mrs	x3, cntpct_el0		/* read timer */
3659f3183d2SMingkai Hu	add	x3, x3, #1200		/* timeout after 100 microseconds */
3669f3183d2SMingkai Hu	mov	x0, #0x18
3679f3183d2SMingkai Hu	movk	x0, #0x420, lsl #16	/* HNF0_PSTATE_STATUS */
3689f3183d2SMingkai Hu	mov	w6, #8			/* HN-F node count */
3699f3183d2SMingkai Hu1:
3709f3183d2SMingkai Hu	ldr	x2, [x0]
3719f3183d2SMingkai Hu	cmp	x2, x1			/* check status */
3729f3183d2SMingkai Hu	b.eq	2f
3739f3183d2SMingkai Hu	mrs	x4, cntpct_el0
3749f3183d2SMingkai Hu	cmp	x4, x3
3759f3183d2SMingkai Hu	b.ls	1b
3769f3183d2SMingkai Hu	mov	x7, #1			/* timeout */
3779f3183d2SMingkai Hu	b	3f
3789f3183d2SMingkai Hu2:
3799f3183d2SMingkai Hu	add	x0, x0, #0x10000	/* move to next node */
3809f3183d2SMingkai Hu	subs	w6, w6, #1
3819f3183d2SMingkai Hu	cbnz	w6, 1b
3829f3183d2SMingkai Hu3:
3839f3183d2SMingkai Hu	mov	x0, x7
3849f3183d2SMingkai Hu	ret
3859f3183d2SMingkai Hu
3869f3183d2SMingkai Huhnf_set_pstate:
3879f3183d2SMingkai Hu	/* x0 has the desired state, clobber x1, x2, x6 */
3889f3183d2SMingkai Hu	mov	x1, x0
3899f3183d2SMingkai Hu	/* power state to SFONLY */
3909f3183d2SMingkai Hu	mov	w6, #8			/* HN-F node count */
3919f3183d2SMingkai Hu	mov	x0, #0x10
3929f3183d2SMingkai Hu	movk	x0, #0x420, lsl #16	/* HNF0_PSTATE_REQ */
3939f3183d2SMingkai Hu1:	/* set pstate to sfonly */
3949f3183d2SMingkai Hu	ldr	x2, [x0]
3959f3183d2SMingkai Hu	and	x2, x2, #0xfffffffffffffffc	/* & HNFPSTAT_MASK */
3969f3183d2SMingkai Hu	orr	x2, x2, x1
3979f3183d2SMingkai Hu	str	x2, [x0]
3989f3183d2SMingkai Hu	add	x0, x0, #0x10000	/* move to next node */
3999f3183d2SMingkai Hu	subs	w6, w6, #1
4009f3183d2SMingkai Hu	cbnz	w6, 1b
4019f3183d2SMingkai Hu
4029f3183d2SMingkai Hu	ret
4039f3183d2SMingkai Hu
4041ab557a0SStephen WarrenENTRY(__asm_flush_l3_dcache)
4059f3183d2SMingkai Hu	/*
4069f3183d2SMingkai Hu	 * Return status in x0
4079f3183d2SMingkai Hu	 *    success 0
408399e2bb6SYork Sun	 *    timeout 1 for setting SFONLY, 2 for FAM, 3 for both
4099f3183d2SMingkai Hu	 */
4109f3183d2SMingkai Hu	mov	x29, lr
4119f3183d2SMingkai Hu	mov	x8, #0
4129f3183d2SMingkai Hu
4139f3183d2SMingkai Hu	dsb	sy
4149f3183d2SMingkai Hu	mov	x0, #0x1		/* HNFPSTAT_SFONLY */
4159f3183d2SMingkai Hu	bl	hnf_set_pstate
4169f3183d2SMingkai Hu
4179f3183d2SMingkai Hu	mov	x0, #0x4		/* SFONLY status */
4189f3183d2SMingkai Hu	bl	hnf_pstate_poll
4199f3183d2SMingkai Hu	cbz	x0, 1f
4209f3183d2SMingkai Hu	mov	x8, #1			/* timeout */
4219f3183d2SMingkai Hu1:
4229f3183d2SMingkai Hu	dsb	sy
4239f3183d2SMingkai Hu	mov	x0, #0x3		/* HNFPSTAT_FAM */
4249f3183d2SMingkai Hu	bl	hnf_set_pstate
4259f3183d2SMingkai Hu
4269f3183d2SMingkai Hu	mov	x0, #0xc		/* FAM status */
4279f3183d2SMingkai Hu	bl	hnf_pstate_poll
4289f3183d2SMingkai Hu	cbz	x0, 1f
4299f3183d2SMingkai Hu	add	x8, x8, #0x2
4309f3183d2SMingkai Hu1:
4319f3183d2SMingkai Hu	mov	x0, x8
4329f3183d2SMingkai Hu	mov	lr, x29
4339f3183d2SMingkai Hu	ret
4341ab557a0SStephen WarrenENDPROC(__asm_flush_l3_dcache)
435c055cee1SAshish Kumar#endif /* CONFIG_SYS_FSL_HAS_CCN504 */
4369f3183d2SMingkai Hu
4379f3183d2SMingkai Hu#ifdef CONFIG_MP
4389f3183d2SMingkai Hu	/* Keep literals not used by the secondary boot code outside it */
4399f3183d2SMingkai Hu	.ltorg
4409f3183d2SMingkai Hu
4419f3183d2SMingkai Hu	/* Using 64 bit alignment since the spin table is accessed as data */
4429f3183d2SMingkai Hu	.align 4
4439f3183d2SMingkai Hu	.global secondary_boot_code
4449f3183d2SMingkai Hu	/* Secondary Boot Code starts here */
4459f3183d2SMingkai Husecondary_boot_code:
4469f3183d2SMingkai Hu	.global __spin_table
4479f3183d2SMingkai Hu__spin_table:
4489f3183d2SMingkai Hu	.space CONFIG_MAX_CPUS*SPIN_TABLE_ELEM_SIZE
4499f3183d2SMingkai Hu
4509f3183d2SMingkai Hu	.align 2
4519f3183d2SMingkai HuENTRY(secondary_boot_func)
4529f3183d2SMingkai Hu	/*
4539f3183d2SMingkai Hu	 * MPIDR_EL1 Fields:
4549f3183d2SMingkai Hu	 * MPIDR[1:0] = AFF0_CPUID <- Core ID (0,1)
4559f3183d2SMingkai Hu	 * MPIDR[7:2] = AFF0_RES
4569f3183d2SMingkai Hu	 * MPIDR[15:8] = AFF1_CLUSTERID <- Cluster ID (0,1,2,3)
4579f3183d2SMingkai Hu	 * MPIDR[23:16] = AFF2_CLUSTERID
4589f3183d2SMingkai Hu	 * MPIDR[24] = MT
4599f3183d2SMingkai Hu	 * MPIDR[29:25] = RES0
4609f3183d2SMingkai Hu	 * MPIDR[30] = U
4619f3183d2SMingkai Hu	 * MPIDR[31] = ME
4629f3183d2SMingkai Hu	 * MPIDR[39:32] = AFF3
4639f3183d2SMingkai Hu	 *
4649f3183d2SMingkai Hu	 * Linear Processor ID (LPID) calculation from MPIDR_EL1:
4659f3183d2SMingkai Hu	 * (We only use AFF0_CPUID and AFF1_CLUSTERID for now
4669f3183d2SMingkai Hu	 * until AFF2_CLUSTERID and AFF3 have non-zero values)
4679f3183d2SMingkai Hu	 *
4689f3183d2SMingkai Hu	 * LPID = MPIDR[15:8] | MPIDR[1:0]
4699f3183d2SMingkai Hu	 */
4709f3183d2SMingkai Hu	mrs	x0, mpidr_el1
4719f3183d2SMingkai Hu	ubfm	x1, x0, #8, #15
4729f3183d2SMingkai Hu	ubfm	x2, x0, #0, #1
4739f3183d2SMingkai Hu	orr	x10, x2, x1, lsl #2	/* x10 has LPID */
4749f3183d2SMingkai Hu	ubfm    x9, x0, #0, #15         /* x9 contains MPIDR[15:0] */
4759f3183d2SMingkai Hu	/*
4769f3183d2SMingkai Hu	 * offset of the spin table element for this core from start of spin
4779f3183d2SMingkai Hu	 * table (each elem is padded to 64 bytes)
4789f3183d2SMingkai Hu	 */
4799f3183d2SMingkai Hu	lsl	x1, x10, #6
4809f3183d2SMingkai Hu	ldr	x0, =__spin_table
4819f3183d2SMingkai Hu	/* physical address of this cpus spin table element */
4829f3183d2SMingkai Hu	add	x11, x1, x0
4839f3183d2SMingkai Hu
4849f3183d2SMingkai Hu	ldr	x0, =__real_cntfrq
4859f3183d2SMingkai Hu	ldr	x0, [x0]
4869f3183d2SMingkai Hu	msr	cntfrq_el0, x0	/* set with real frequency */
4879f3183d2SMingkai Hu	str	x9, [x11, #16]	/* LPID */
4889f3183d2SMingkai Hu	mov	x4, #1
4899f3183d2SMingkai Hu	str	x4, [x11, #8]	/* STATUS */
4909f3183d2SMingkai Hu	dsb	sy
4919f3183d2SMingkai Hu#if defined(CONFIG_GICV3)
4929f3183d2SMingkai Hu	gic_wait_for_interrupt_m x0
4939f3183d2SMingkai Hu#elif defined(CONFIG_GICV2)
494fa18ed76SWenbin Song	bl	get_gic_offset
495fa18ed76SWenbin Song	mov	x0, x1
4969f3183d2SMingkai Hu        gic_wait_for_interrupt_m x0, w1
4979f3183d2SMingkai Hu#endif
4989f3183d2SMingkai Hu
4999f3183d2SMingkai Huslave_cpu:
5009f3183d2SMingkai Hu	wfe
5019f3183d2SMingkai Hu	ldr	x0, [x11]
5029f3183d2SMingkai Hu	cbz	x0, slave_cpu
5039f3183d2SMingkai Hu#ifndef CONFIG_ARMV8_SWITCH_TO_EL1
5049f3183d2SMingkai Hu	mrs     x1, sctlr_el2
5059f3183d2SMingkai Hu#else
5069f3183d2SMingkai Hu	mrs     x1, sctlr_el1
5079f3183d2SMingkai Hu#endif
5089f3183d2SMingkai Hu	tbz     x1, #25, cpu_is_le
5099f3183d2SMingkai Hu	rev     x0, x0                  /* BE to LE conversion */
5109f3183d2SMingkai Hucpu_is_le:
511ec6617c3SAlison Wang	ldr	x5, [x11, #24]
512020b3ce8SAlison Wang	cbz	x5, 1f
513ec6617c3SAlison Wang
514ec6617c3SAlison Wang#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
5157c5e1febSAlison Wang	adr	x4, secondary_switch_to_el1
5167c5e1febSAlison Wang	ldr	x5, =ES_TO_AARCH64
517ec6617c3SAlison Wang#else
5187c5e1febSAlison Wang	ldr	x4, [x11]
5197c5e1febSAlison Wang	ldr	x5, =ES_TO_AARCH32
520ec6617c3SAlison Wang#endif
521ec6617c3SAlison Wang	bl	secondary_switch_to_el2
522ec6617c3SAlison Wang
523ec6617c3SAlison Wang1:
524ec6617c3SAlison Wang#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
5257c5e1febSAlison Wang	adr	x4, secondary_switch_to_el1
526ec6617c3SAlison Wang#else
5277c5e1febSAlison Wang	ldr	x4, [x11]
528ec6617c3SAlison Wang#endif
5297c5e1febSAlison Wang	ldr	x5, =ES_TO_AARCH64
530ec6617c3SAlison Wang	bl	secondary_switch_to_el2
531ec6617c3SAlison Wang
5329f3183d2SMingkai HuENDPROC(secondary_boot_func)
5339f3183d2SMingkai Hu
5349f3183d2SMingkai HuENTRY(secondary_switch_to_el2)
5357c5e1febSAlison Wang	switch_el x6, 1f, 0f, 0f
5369f3183d2SMingkai Hu0:	ret
5377c5e1febSAlison Wang1:	armv8_switch_to_el2_m x4, x5, x6
5389f3183d2SMingkai HuENDPROC(secondary_switch_to_el2)
5399f3183d2SMingkai Hu
5409f3183d2SMingkai HuENTRY(secondary_switch_to_el1)
541ec6617c3SAlison Wang	mrs	x0, mpidr_el1
542ec6617c3SAlison Wang	ubfm	x1, x0, #8, #15
543ec6617c3SAlison Wang	ubfm	x2, x0, #0, #1
544ec6617c3SAlison Wang	orr	x10, x2, x1, lsl #2	/* x10 has LPID */
545ec6617c3SAlison Wang
546ec6617c3SAlison Wang	lsl	x1, x10, #6
547ec6617c3SAlison Wang	ldr	x0, =__spin_table
548ec6617c3SAlison Wang	/* physical address of this cpus spin table element */
549ec6617c3SAlison Wang	add	x11, x1, x0
550ec6617c3SAlison Wang
5517c5e1febSAlison Wang	ldr	x4, [x11]
552ec6617c3SAlison Wang
553ec6617c3SAlison Wang	ldr	x5, [x11, #24]
554020b3ce8SAlison Wang	cbz	x5, 2f
555ec6617c3SAlison Wang
5567c5e1febSAlison Wang	ldr	x5, =ES_TO_AARCH32
557ec6617c3SAlison Wang	bl	switch_to_el1
558ec6617c3SAlison Wang
5597c5e1febSAlison Wang2:	ldr	x5, =ES_TO_AARCH64
560ec6617c3SAlison Wang
561ec6617c3SAlison Wangswitch_to_el1:
5627c5e1febSAlison Wang	switch_el x6, 0f, 1f, 0f
5639f3183d2SMingkai Hu0:	ret
5647c5e1febSAlison Wang1:	armv8_switch_to_el1_m x4, x5, x6
5659f3183d2SMingkai HuENDPROC(secondary_switch_to_el1)
5669f3183d2SMingkai Hu
5679f3183d2SMingkai Hu	/* Ensure that the literals used by the secondary boot code are
5689f3183d2SMingkai Hu	 * assembled within it (this is required so that we can protect
5699f3183d2SMingkai Hu	 * this area with a single memreserve region
5709f3183d2SMingkai Hu	 */
5719f3183d2SMingkai Hu	.ltorg
5729f3183d2SMingkai Hu
5739f3183d2SMingkai Hu	/* 64 bit alignment for elements accessed as data */
5749f3183d2SMingkai Hu	.align 4
5759f3183d2SMingkai Hu	.global __real_cntfrq
5769f3183d2SMingkai Hu__real_cntfrq:
5779f3183d2SMingkai Hu	.quad COUNTER_FREQUENCY
5789f3183d2SMingkai Hu	.globl __secondary_boot_code_size
5799f3183d2SMingkai Hu	.type __secondary_boot_code_size, %object
5809f3183d2SMingkai Hu	/* Secondary Boot Code ends here */
5819f3183d2SMingkai Hu__secondary_boot_code_size:
5829f3183d2SMingkai Hu	.quad .-secondary_boot_code
5839f3183d2SMingkai Hu#endif
584