xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S (revision 1a4f6af8bfd44c8ae6e87a81ff125eed47042cc5)
19f3183d2SMingkai Hu/*
29f3183d2SMingkai Hu * (C) Copyright 2014-2015 Freescale Semiconductor
39f3183d2SMingkai Hu *
49f3183d2SMingkai Hu * SPDX-License-Identifier:	GPL-2.0+
59f3183d2SMingkai Hu *
69f3183d2SMingkai Hu * Extracted from armv8/start.S
79f3183d2SMingkai Hu */
89f3183d2SMingkai Hu
99f3183d2SMingkai Hu#include <config.h>
109f3183d2SMingkai Hu#include <linux/linkage.h>
119f3183d2SMingkai Hu#include <asm/gic.h>
129f3183d2SMingkai Hu#include <asm/macro.h>
13fa18ed76SWenbin Song#include <asm/arch-fsl-layerscape/soc.h>
149f3183d2SMingkai Hu#ifdef CONFIG_MP
159f3183d2SMingkai Hu#include <asm/arch/mp.h>
169f3183d2SMingkai Hu#endif
17f6a70b3aSPriyanka Jain#ifdef CONFIG_FSL_LSCH3
18f6a70b3aSPriyanka Jain#include <asm/arch-fsl-layerscape/immap_lsch3.h>
19f6a70b3aSPriyanka Jain#endif
20ec6617c3SAlison Wang#include <asm/u-boot.h>
219f3183d2SMingkai Hu
22fa18ed76SWenbin Song/* Get GIC offset
23fa18ed76SWenbin Song* For LS1043a rev1.0, GIC base address align with 4k.
24fa18ed76SWenbin Song* For LS1043a rev1.1, if DCFG_GIC400_ALIGN[GIC_ADDR_BIT]
25fa18ed76SWenbin Song* is set, GIC base address align with 4K, or else align
26fa18ed76SWenbin Song* with 64k.
27fa18ed76SWenbin Song* output:
28fa18ed76SWenbin Song*	x0: the base address of GICD
29fa18ed76SWenbin Song*	x1: the base address of GICC
30fa18ed76SWenbin Song*/
31fa18ed76SWenbin SongENTRY(get_gic_offset)
32fa18ed76SWenbin Song	ldr     x0, =GICD_BASE
33fa18ed76SWenbin Song#ifdef CONFIG_GICV2
34fa18ed76SWenbin Song	ldr     x1, =GICC_BASE
35fa18ed76SWenbin Song#endif
36fa18ed76SWenbin Song#ifdef CONFIG_HAS_FEATURE_GIC64K_ALIGN
37fa18ed76SWenbin Song	ldr     x2, =DCFG_CCSR_SVR
38fa18ed76SWenbin Song	ldr	w2, [x2]
39fa18ed76SWenbin Song	rev	w2, w2
40*739cab17SWenbin song	lsr	w3, w2, #16
41*739cab17SWenbin song	ldr	w4, =SVR_DEV(SVR_LS1043A)
42fa18ed76SWenbin Song	cmp	w3, w4
43fa18ed76SWenbin Song	b.ne	1f
44fa18ed76SWenbin Song	ands	w2, w2, #0xff
45fa18ed76SWenbin Song	cmp	w2, #REV1_0
46fa18ed76SWenbin Song	b.eq	1f
47fa18ed76SWenbin Song	ldr	x2, =SCFG_GIC400_ALIGN
48fa18ed76SWenbin Song	ldr	w2, [x2]
49fa18ed76SWenbin Song	rev	w2, w2
50fa18ed76SWenbin Song	tbnz	w2, #GIC_ADDR_BIT, 1f
51fa18ed76SWenbin Song	ldr     x0, =GICD_BASE_64K
52fa18ed76SWenbin Song#ifdef CONFIG_GICV2
53fa18ed76SWenbin Song	ldr     x1, =GICC_BASE_64K
54fa18ed76SWenbin Song#endif
55fa18ed76SWenbin Song1:
56fa18ed76SWenbin Song#endif
57fa18ed76SWenbin Song	ret
58fa18ed76SWenbin SongENDPROC(get_gic_offset)
59fa18ed76SWenbin Song
60fa18ed76SWenbin SongENTRY(smp_kick_all_cpus)
61fa18ed76SWenbin Song	/* Kick secondary cpus up by SGI 0 interrupt */
62fa18ed76SWenbin Song#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
63fa18ed76SWenbin Song	mov	x29, lr			/* Save LR */
64fa18ed76SWenbin Song	bl	get_gic_offset
65fa18ed76SWenbin Song	bl	gic_kick_secondary_cpus
66fa18ed76SWenbin Song	mov	lr, x29			/* Restore LR */
67fa18ed76SWenbin Song#endif
68fa18ed76SWenbin Song	ret
69fa18ed76SWenbin SongENDPROC(smp_kick_all_cpus)
70fa18ed76SWenbin Song
71fa18ed76SWenbin Song
729f3183d2SMingkai HuENTRY(lowlevel_init)
739f3183d2SMingkai Hu	mov	x29, lr			/* Save LR */
749f3183d2SMingkai Hu
75399e2bb6SYork Sun	switch_el x1, 1f, 100f, 100f	/* skip if not in EL3 */
76399e2bb6SYork Sun1:
77399e2bb6SYork Sun
789f3183d2SMingkai Hu#ifdef CONFIG_FSL_LSCH3
792b690b98SPrabhakar Kushwaha
802b690b98SPrabhakar Kushwaha	/* Set Wuo bit for RN-I 20 */
814a3ab193SYork Sun#ifdef CONFIG_ARCH_LS2080A
822b690b98SPrabhakar Kushwaha	ldr	x0, =CCI_AUX_CONTROL_BASE(20)
832b690b98SPrabhakar Kushwaha	ldr	x1, =0x00000010
842b690b98SPrabhakar Kushwaha	bl	ccn504_set_aux
85d037261fSPriyanka Jain
86d037261fSPriyanka Jain	/*
87d037261fSPriyanka Jain	 * Set forced-order mode in RNI-6, RNI-20
88d037261fSPriyanka Jain	 * This is required for performance optimization on LS2088A
89d037261fSPriyanka Jain	 * LS2080A family does not support setting forced-order mode,
90d037261fSPriyanka Jain	 * so skip this operation for LS2080A family
91d037261fSPriyanka Jain	 */
92d037261fSPriyanka Jain	bl	get_svr
93d037261fSPriyanka Jain	lsr	w0, w0, #16
94*739cab17SWenbin song	ldr	w1, =SVR_DEV(SVR_LS2080A)
95d037261fSPriyanka Jain	cmp	w0, w1
96d037261fSPriyanka Jain	b.eq	1f
97d037261fSPriyanka Jain
98d037261fSPriyanka Jain	ldr	x0, =CCI_AUX_CONTROL_BASE(6)
99d037261fSPriyanka Jain	ldr	x1, =0x00000020
100d037261fSPriyanka Jain	bl	ccn504_set_aux
101d037261fSPriyanka Jain	ldr	x0, =CCI_AUX_CONTROL_BASE(20)
102d037261fSPriyanka Jain	ldr	x1, =0x00000020
103d037261fSPriyanka Jain	bl	ccn504_set_aux
104d037261fSPriyanka Jain1:
1052b690b98SPrabhakar Kushwaha#endif
1062b690b98SPrabhakar Kushwaha
1079f3183d2SMingkai Hu	/* Add fully-coherent masters to DVM domain */
1089f3183d2SMingkai Hu	ldr	x0, =CCI_MN_BASE
1099f3183d2SMingkai Hu	ldr	x1, =CCI_MN_RNF_NODEID_LIST
1109f3183d2SMingkai Hu	ldr	x2, =CCI_MN_DVM_DOMAIN_CTL_SET
1119f3183d2SMingkai Hu	bl	ccn504_add_masters_to_dvm
1129f3183d2SMingkai Hu
1139f3183d2SMingkai Hu	/* Set all RN-I ports to QoS of 15 */
1149f3183d2SMingkai Hu	ldr	x0, =CCI_S0_QOS_CONTROL_BASE(0)
1159f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1169f3183d2SMingkai Hu	bl	ccn504_set_qos
1179f3183d2SMingkai Hu	ldr	x0, =CCI_S1_QOS_CONTROL_BASE(0)
1189f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1199f3183d2SMingkai Hu	bl	ccn504_set_qos
1209f3183d2SMingkai Hu	ldr	x0, =CCI_S2_QOS_CONTROL_BASE(0)
1219f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1229f3183d2SMingkai Hu	bl	ccn504_set_qos
1239f3183d2SMingkai Hu
1249f3183d2SMingkai Hu	ldr	x0, =CCI_S0_QOS_CONTROL_BASE(2)
1259f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1269f3183d2SMingkai Hu	bl	ccn504_set_qos
1279f3183d2SMingkai Hu	ldr	x0, =CCI_S1_QOS_CONTROL_BASE(2)
1289f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1299f3183d2SMingkai Hu	bl	ccn504_set_qos
1309f3183d2SMingkai Hu	ldr	x0, =CCI_S2_QOS_CONTROL_BASE(2)
1319f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1329f3183d2SMingkai Hu	bl	ccn504_set_qos
1339f3183d2SMingkai Hu
1349f3183d2SMingkai Hu	ldr	x0, =CCI_S0_QOS_CONTROL_BASE(6)
1359f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1369f3183d2SMingkai Hu	bl	ccn504_set_qos
1379f3183d2SMingkai Hu	ldr	x0, =CCI_S1_QOS_CONTROL_BASE(6)
1389f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1399f3183d2SMingkai Hu	bl	ccn504_set_qos
1409f3183d2SMingkai Hu	ldr	x0, =CCI_S2_QOS_CONTROL_BASE(6)
1419f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1429f3183d2SMingkai Hu	bl	ccn504_set_qos
1439f3183d2SMingkai Hu
1449f3183d2SMingkai Hu	ldr	x0, =CCI_S0_QOS_CONTROL_BASE(12)
1459f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1469f3183d2SMingkai Hu	bl	ccn504_set_qos
1479f3183d2SMingkai Hu	ldr	x0, =CCI_S1_QOS_CONTROL_BASE(12)
1489f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1499f3183d2SMingkai Hu	bl	ccn504_set_qos
1509f3183d2SMingkai Hu	ldr	x0, =CCI_S2_QOS_CONTROL_BASE(12)
1519f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1529f3183d2SMingkai Hu	bl	ccn504_set_qos
1539f3183d2SMingkai Hu
1549f3183d2SMingkai Hu	ldr	x0, =CCI_S0_QOS_CONTROL_BASE(16)
1559f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1569f3183d2SMingkai Hu	bl	ccn504_set_qos
1579f3183d2SMingkai Hu	ldr	x0, =CCI_S1_QOS_CONTROL_BASE(16)
1589f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1599f3183d2SMingkai Hu	bl	ccn504_set_qos
1609f3183d2SMingkai Hu	ldr	x0, =CCI_S2_QOS_CONTROL_BASE(16)
1619f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1629f3183d2SMingkai Hu	bl	ccn504_set_qos
1639f3183d2SMingkai Hu
1649f3183d2SMingkai Hu	ldr	x0, =CCI_S0_QOS_CONTROL_BASE(20)
1659f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1669f3183d2SMingkai Hu	bl	ccn504_set_qos
1679f3183d2SMingkai Hu	ldr	x0, =CCI_S1_QOS_CONTROL_BASE(20)
1689f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1699f3183d2SMingkai Hu	bl	ccn504_set_qos
1709f3183d2SMingkai Hu	ldr	x0, =CCI_S2_QOS_CONTROL_BASE(20)
1719f3183d2SMingkai Hu	ldr	x1, =0x00FF000C
1729f3183d2SMingkai Hu	bl	ccn504_set_qos
1739f3183d2SMingkai Hu#endif
1749f3183d2SMingkai Hu
1751e49a231SPrabhakar Kushwaha#ifdef SMMU_BASE
1769f3183d2SMingkai Hu	/* Set the SMMU page size in the sACR register */
1779f3183d2SMingkai Hu	ldr	x1, =SMMU_BASE
1789f3183d2SMingkai Hu	ldr	w0, [x1, #0x10]
1799f3183d2SMingkai Hu	orr	w0, w0, #1 << 16  /* set sACR.pagesize to indicate 64K page */
1809f3183d2SMingkai Hu	str	w0, [x1, #0x10]
1811e49a231SPrabhakar Kushwaha#endif
1829f3183d2SMingkai Hu
1839f3183d2SMingkai Hu	/* Initialize GIC Secure Bank Status */
1849f3183d2SMingkai Hu#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
1859f3183d2SMingkai Hu	branch_if_slave x0, 1f
186fa18ed76SWenbin Song	bl	get_gic_offset
1879f3183d2SMingkai Hu	bl	gic_init_secure
1889f3183d2SMingkai Hu1:
1899f3183d2SMingkai Hu#ifdef CONFIG_GICV3
1909f3183d2SMingkai Hu	ldr	x0, =GICR_BASE
1919f3183d2SMingkai Hu	bl	gic_init_secure_percpu
1929f3183d2SMingkai Hu#elif defined(CONFIG_GICV2)
193fa18ed76SWenbin Song	bl	get_gic_offset
1949f3183d2SMingkai Hu	bl	gic_init_secure_percpu
1959f3183d2SMingkai Hu#endif
1969f3183d2SMingkai Hu#endif
1979f3183d2SMingkai Hu
198399e2bb6SYork Sun100:
1999f3183d2SMingkai Hu	branch_if_master x0, x1, 2f
2009f3183d2SMingkai Hu
2019f3183d2SMingkai Hu#if defined(CONFIG_MP) && defined(CONFIG_ARMV8_MULTIENTRY)
2029f3183d2SMingkai Hu	ldr	x0, =secondary_boot_func
2039f3183d2SMingkai Hu	blr	x0
2049f3183d2SMingkai Hu#endif
2059f3183d2SMingkai Hu
2069f3183d2SMingkai Hu2:
207399e2bb6SYork Sun	switch_el x1, 1f, 100f, 100f	/* skip if not in EL3 */
208399e2bb6SYork Sun1:
2099f3183d2SMingkai Hu#ifdef CONFIG_FSL_TZPC_BP147
2109f3183d2SMingkai Hu	/* Set Non Secure access for all devices protected via TZPC */
2119f3183d2SMingkai Hu	ldr	x1, =TZPCDECPROT_0_SET_BASE /* Decode Protection-0 Set Reg */
2129f3183d2SMingkai Hu	orr	w0, w0, #1 << 3 /* DCFG_RESET is accessible from NS world */
2139f3183d2SMingkai Hu	str	w0, [x1]
2149f3183d2SMingkai Hu
2159f3183d2SMingkai Hu	isb
2169f3183d2SMingkai Hu	dsb	sy
2179f3183d2SMingkai Hu#endif
2189f3183d2SMingkai Hu
2199f3183d2SMingkai Hu#ifdef CONFIG_FSL_TZASC_400
220d5df606dSPriyanka Jain	/*
221d5df606dSPriyanka Jain	 * LS2080 and its personalities does not support TZASC
222d5df606dSPriyanka Jain	 * So skip TZASC related operations
223d5df606dSPriyanka Jain	 */
224d5df606dSPriyanka Jain	bl	get_svr
225d5df606dSPriyanka Jain	lsr	w0, w0, #16
226*739cab17SWenbin song	ldr	w1, =SVR_DEV(SVR_LS2080A)
227d5df606dSPriyanka Jain	cmp	w0, w1
228d5df606dSPriyanka Jain	b.eq	1f
229d5df606dSPriyanka Jain
2309f3183d2SMingkai Hu	/* Set TZASC so that:
2319f3183d2SMingkai Hu	 * a. We use only Region0 whose global secure write/read is EN
2329f3183d2SMingkai Hu	 * b. We use only Region0 whose NSAID write/read is EN
2339f3183d2SMingkai Hu	 *
2349f3183d2SMingkai Hu	 * NOTE: As per the CCSR map doc, TZASC 3 and TZASC 4 are just
2359f3183d2SMingkai Hu	 * 	 placeholders.
2369f3183d2SMingkai Hu	 */
23785a9a14eSAshish kumar#ifdef CONFIG_FSL_TZASC_1
2389f3183d2SMingkai Hu	ldr	x1, =TZASC_GATE_KEEPER(0)
2397cfbb4abSPriyanka Jain	ldr	w0, [x1]		/* Filter 0 Gate Keeper Register */
2407cfbb4abSPriyanka Jain	orr	w0, w0, #1 << 0		/* Set open_request for Filter 0 */
2417cfbb4abSPriyanka Jain	str	w0, [x1]
2429f3183d2SMingkai Hu
2439f3183d2SMingkai Hu	ldr	x1, =TZASC_REGION_ATTRIBUTES_0(0)
2447cfbb4abSPriyanka Jain	ldr	w0, [x1]		/* Region-0 Attributes Register */
2457cfbb4abSPriyanka Jain	orr	w0, w0, #1 << 31	/* Set Sec global write en, Bit[31] */
2467cfbb4abSPriyanka Jain	orr	w0, w0, #1 << 30	/* Set Sec global read en, Bit[30] */
2477cfbb4abSPriyanka Jain	str	w0, [x1]
2489f3183d2SMingkai Hu
24985a9a14eSAshish kumar	ldr	x1, =TZASC_REGION_ID_ACCESS_0(0)
25085a9a14eSAshish kumar	ldr	w0, [x1]		/* Region-0 Access Register */
25185a9a14eSAshish kumar	mov	w0, #0xFFFFFFFF		/* Set nsaid_wr_en and nsaid_rd_en */
25285a9a14eSAshish kumar	str	w0, [x1]
25385a9a14eSAshish kumar#endif
25485a9a14eSAshish kumar#ifdef CONFIG_FSL_TZASC_2
25585a9a14eSAshish kumar	ldr	x1, =TZASC_GATE_KEEPER(1)
25685a9a14eSAshish kumar	ldr	w0, [x1]		/* Filter 0 Gate Keeper Register */
25785a9a14eSAshish kumar	orr	w0, w0, #1 << 0		/* Set open_request for Filter 0 */
25885a9a14eSAshish kumar	str	w0, [x1]
25985a9a14eSAshish kumar
2609f3183d2SMingkai Hu	ldr	x1, =TZASC_REGION_ATTRIBUTES_0(1)
2617cfbb4abSPriyanka Jain	ldr	w0, [x1]		/* Region-1 Attributes Register */
2627cfbb4abSPriyanka Jain	orr	w0, w0, #1 << 31	/* Set Sec global write en, Bit[31] */
2637cfbb4abSPriyanka Jain	orr	w0, w0, #1 << 30	/* Set Sec global read en, Bit[30] */
2647cfbb4abSPriyanka Jain	str	w0, [x1]
2659f3183d2SMingkai Hu
2669f3183d2SMingkai Hu	ldr	x1, =TZASC_REGION_ID_ACCESS_0(1)
2679f3183d2SMingkai Hu	ldr	w0, [x1]		/* Region-1 Attributes Register */
2689f3183d2SMingkai Hu	mov	w0, #0xFFFFFFFF		/* Set nsaid_wr_en and nsaid_rd_en */
2699f3183d2SMingkai Hu	str	w0, [x1]
27085a9a14eSAshish kumar#endif
2719f3183d2SMingkai Hu	isb
2729f3183d2SMingkai Hu	dsb	sy
2739f3183d2SMingkai Hu#endif
274399e2bb6SYork Sun100:
275d5df606dSPriyanka Jain1:
276da28e58aSYork Sun#ifdef CONFIG_ARCH_LS1046A
277399e2bb6SYork Sun	switch_el x1, 1f, 100f, 100f	/* skip if not in EL3 */
278399e2bb6SYork Sun1:
27913f79880SMingkai Hu	/* Initialize the L2 RAM latency */
28013f79880SMingkai Hu	mrs   x1, S3_1_c11_c0_2
28113f79880SMingkai Hu	mov   x0, #0x1C7
28213f79880SMingkai Hu	/* Clear L2 Tag RAM latency and L2 Data RAM latency */
28313f79880SMingkai Hu	bic   x1, x1, x0
28413f79880SMingkai Hu	/* Set L2 data ram latency bits [2:0] */
28513f79880SMingkai Hu	orr   x1, x1, #0x2
28613f79880SMingkai Hu	/* set L2 tag ram latency bits [8:6] */
28713f79880SMingkai Hu	orr   x1,  x1, #0x80
28813f79880SMingkai Hu	msr   S3_1_c11_c0_2, x1
28913f79880SMingkai Hu	isb
290399e2bb6SYork Sun100:
29113f79880SMingkai Hu#endif
29213f79880SMingkai Hu
2933b6bf811SHou Zhiqiang#if defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD)
2943b6bf811SHou Zhiqiang	bl	fsl_ocram_init
2953b6bf811SHou Zhiqiang#endif
2963b6bf811SHou Zhiqiang
2979f3183d2SMingkai Hu	mov	lr, x29			/* Restore LR */
2989f3183d2SMingkai Hu	ret
2999f3183d2SMingkai HuENDPROC(lowlevel_init)
3009f3183d2SMingkai Hu
3013b6bf811SHou Zhiqiang#if defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD)
3023b6bf811SHou ZhiqiangENTRY(fsl_ocram_init)
3033b6bf811SHou Zhiqiang	mov	x28, lr			/* Save LR */
3043b6bf811SHou Zhiqiang	bl	fsl_clear_ocram
3053b6bf811SHou Zhiqiang	bl	fsl_ocram_clear_ecc_err
3063b6bf811SHou Zhiqiang	mov	lr, x28			/* Restore LR */
3073b6bf811SHou Zhiqiang	ret
3083b6bf811SHou ZhiqiangENDPROC(fsl_ocram_init)
3093b6bf811SHou Zhiqiang
3103b6bf811SHou ZhiqiangENTRY(fsl_clear_ocram)
3113b6bf811SHou Zhiqiang/* Clear OCRAM */
3123b6bf811SHou Zhiqiang	ldr	x0, =CONFIG_SYS_FSL_OCRAM_BASE
3133b6bf811SHou Zhiqiang	ldr	x1, =(CONFIG_SYS_FSL_OCRAM_BASE + CONFIG_SYS_FSL_OCRAM_SIZE)
3143b6bf811SHou Zhiqiang	mov	x2, #0
3153b6bf811SHou Zhiqiangclear_loop:
3163b6bf811SHou Zhiqiang	str	x2, [x0]
3173b6bf811SHou Zhiqiang	add	x0, x0, #8
3183b6bf811SHou Zhiqiang	cmp	x0, x1
3193b6bf811SHou Zhiqiang	b.lo	clear_loop
3203b6bf811SHou Zhiqiang	ret
3213b6bf811SHou ZhiqiangENDPROC(fsl_clear_ocram)
3223b6bf811SHou Zhiqiang
3233b6bf811SHou ZhiqiangENTRY(fsl_ocram_clear_ecc_err)
3243b6bf811SHou Zhiqiang	/* OCRAM1/2 ECC status bit */
3253b6bf811SHou Zhiqiang	mov	w1, #0x60
3263b6bf811SHou Zhiqiang	ldr	x0, =DCSR_DCFG_SBEESR2
3273b6bf811SHou Zhiqiang	str	w1, [x0]
3283b6bf811SHou Zhiqiang	ldr	x0, =DCSR_DCFG_MBEESR2
3293b6bf811SHou Zhiqiang	str	w1, [x0]
3303b6bf811SHou Zhiqiang	ret
3313b6bf811SHou ZhiqiangENDPROC(fsl_ocram_init)
3323b6bf811SHou Zhiqiang#endif
3333b6bf811SHou Zhiqiang
334b7f2bbffSPrabhakar Kushwaha#ifdef CONFIG_FSL_LSCH3
335f6a70b3aSPriyanka Jain	.globl get_svr
336f6a70b3aSPriyanka Jainget_svr:
337f6a70b3aSPriyanka Jain	ldr	x1, =FSL_LSCH3_SVR
338f6a70b3aSPriyanka Jain	ldr	w0, [x1]
339f6a70b3aSPriyanka Jain	ret
340f6a70b3aSPriyanka Jain
3419f3183d2SMingkai Huhnf_pstate_poll:
3429f3183d2SMingkai Hu	/* x0 has the desired status, return 0 for success, 1 for timeout
3439f3183d2SMingkai Hu	 * clobber x1, x2, x3, x4, x6, x7
3449f3183d2SMingkai Hu	 */
3459f3183d2SMingkai Hu	mov	x1, x0
3469f3183d2SMingkai Hu	mov	x7, #0			/* flag for timeout */
3479f3183d2SMingkai Hu	mrs	x3, cntpct_el0		/* read timer */
3489f3183d2SMingkai Hu	add	x3, x3, #1200		/* timeout after 100 microseconds */
3499f3183d2SMingkai Hu	mov	x0, #0x18
3509f3183d2SMingkai Hu	movk	x0, #0x420, lsl #16	/* HNF0_PSTATE_STATUS */
3519f3183d2SMingkai Hu	mov	w6, #8			/* HN-F node count */
3529f3183d2SMingkai Hu1:
3539f3183d2SMingkai Hu	ldr	x2, [x0]
3549f3183d2SMingkai Hu	cmp	x2, x1			/* check status */
3559f3183d2SMingkai Hu	b.eq	2f
3569f3183d2SMingkai Hu	mrs	x4, cntpct_el0
3579f3183d2SMingkai Hu	cmp	x4, x3
3589f3183d2SMingkai Hu	b.ls	1b
3599f3183d2SMingkai Hu	mov	x7, #1			/* timeout */
3609f3183d2SMingkai Hu	b	3f
3619f3183d2SMingkai Hu2:
3629f3183d2SMingkai Hu	add	x0, x0, #0x10000	/* move to next node */
3639f3183d2SMingkai Hu	subs	w6, w6, #1
3649f3183d2SMingkai Hu	cbnz	w6, 1b
3659f3183d2SMingkai Hu3:
3669f3183d2SMingkai Hu	mov	x0, x7
3679f3183d2SMingkai Hu	ret
3689f3183d2SMingkai Hu
3699f3183d2SMingkai Huhnf_set_pstate:
3709f3183d2SMingkai Hu	/* x0 has the desired state, clobber x1, x2, x6 */
3719f3183d2SMingkai Hu	mov	x1, x0
3729f3183d2SMingkai Hu	/* power state to SFONLY */
3739f3183d2SMingkai Hu	mov	w6, #8			/* HN-F node count */
3749f3183d2SMingkai Hu	mov	x0, #0x10
3759f3183d2SMingkai Hu	movk	x0, #0x420, lsl #16	/* HNF0_PSTATE_REQ */
3769f3183d2SMingkai Hu1:	/* set pstate to sfonly */
3779f3183d2SMingkai Hu	ldr	x2, [x0]
3789f3183d2SMingkai Hu	and	x2, x2, #0xfffffffffffffffc	/* & HNFPSTAT_MASK */
3799f3183d2SMingkai Hu	orr	x2, x2, x1
3809f3183d2SMingkai Hu	str	x2, [x0]
3819f3183d2SMingkai Hu	add	x0, x0, #0x10000	/* move to next node */
3829f3183d2SMingkai Hu	subs	w6, w6, #1
3839f3183d2SMingkai Hu	cbnz	w6, 1b
3849f3183d2SMingkai Hu
3859f3183d2SMingkai Hu	ret
3869f3183d2SMingkai Hu
3871ab557a0SStephen WarrenENTRY(__asm_flush_l3_dcache)
3889f3183d2SMingkai Hu	/*
3899f3183d2SMingkai Hu	 * Return status in x0
3909f3183d2SMingkai Hu	 *    success 0
391399e2bb6SYork Sun	 *    timeout 1 for setting SFONLY, 2 for FAM, 3 for both
3929f3183d2SMingkai Hu	 */
3939f3183d2SMingkai Hu	mov	x29, lr
3949f3183d2SMingkai Hu	mov	x8, #0
3959f3183d2SMingkai Hu
396399e2bb6SYork Sun	switch_el x0, 1f, 100f, 100f	/* skip if not in EL3 */
397399e2bb6SYork Sun
398399e2bb6SYork Sun1:
3999f3183d2SMingkai Hu	dsb	sy
4009f3183d2SMingkai Hu	mov	x0, #0x1		/* HNFPSTAT_SFONLY */
4019f3183d2SMingkai Hu	bl	hnf_set_pstate
4029f3183d2SMingkai Hu
4039f3183d2SMingkai Hu	mov	x0, #0x4		/* SFONLY status */
4049f3183d2SMingkai Hu	bl	hnf_pstate_poll
4059f3183d2SMingkai Hu	cbz	x0, 1f
4069f3183d2SMingkai Hu	mov	x8, #1			/* timeout */
4079f3183d2SMingkai Hu1:
4089f3183d2SMingkai Hu	dsb	sy
4099f3183d2SMingkai Hu	mov	x0, #0x3		/* HNFPSTAT_FAM */
4109f3183d2SMingkai Hu	bl	hnf_set_pstate
4119f3183d2SMingkai Hu
4129f3183d2SMingkai Hu	mov	x0, #0xc		/* FAM status */
4139f3183d2SMingkai Hu	bl	hnf_pstate_poll
4149f3183d2SMingkai Hu	cbz	x0, 1f
4159f3183d2SMingkai Hu	add	x8, x8, #0x2
416399e2bb6SYork Sun100:
4179f3183d2SMingkai Hu1:
4189f3183d2SMingkai Hu	mov	x0, x8
4199f3183d2SMingkai Hu	mov	lr, x29
4209f3183d2SMingkai Hu	ret
4211ab557a0SStephen WarrenENDPROC(__asm_flush_l3_dcache)
422b7f2bbffSPrabhakar Kushwaha#endif
4239f3183d2SMingkai Hu
4249f3183d2SMingkai Hu#ifdef CONFIG_MP
4259f3183d2SMingkai Hu	/* Keep literals not used by the secondary boot code outside it */
4269f3183d2SMingkai Hu	.ltorg
4279f3183d2SMingkai Hu
4289f3183d2SMingkai Hu	/* Using 64 bit alignment since the spin table is accessed as data */
4299f3183d2SMingkai Hu	.align 4
4309f3183d2SMingkai Hu	.global secondary_boot_code
4319f3183d2SMingkai Hu	/* Secondary Boot Code starts here */
4329f3183d2SMingkai Husecondary_boot_code:
4339f3183d2SMingkai Hu	.global __spin_table
4349f3183d2SMingkai Hu__spin_table:
4359f3183d2SMingkai Hu	.space CONFIG_MAX_CPUS*SPIN_TABLE_ELEM_SIZE
4369f3183d2SMingkai Hu
4379f3183d2SMingkai Hu	.align 2
4389f3183d2SMingkai HuENTRY(secondary_boot_func)
4399f3183d2SMingkai Hu	/*
4409f3183d2SMingkai Hu	 * MPIDR_EL1 Fields:
4419f3183d2SMingkai Hu	 * MPIDR[1:0] = AFF0_CPUID <- Core ID (0,1)
4429f3183d2SMingkai Hu	 * MPIDR[7:2] = AFF0_RES
4439f3183d2SMingkai Hu	 * MPIDR[15:8] = AFF1_CLUSTERID <- Cluster ID (0,1,2,3)
4449f3183d2SMingkai Hu	 * MPIDR[23:16] = AFF2_CLUSTERID
4459f3183d2SMingkai Hu	 * MPIDR[24] = MT
4469f3183d2SMingkai Hu	 * MPIDR[29:25] = RES0
4479f3183d2SMingkai Hu	 * MPIDR[30] = U
4489f3183d2SMingkai Hu	 * MPIDR[31] = ME
4499f3183d2SMingkai Hu	 * MPIDR[39:32] = AFF3
4509f3183d2SMingkai Hu	 *
4519f3183d2SMingkai Hu	 * Linear Processor ID (LPID) calculation from MPIDR_EL1:
4529f3183d2SMingkai Hu	 * (We only use AFF0_CPUID and AFF1_CLUSTERID for now
4539f3183d2SMingkai Hu	 * until AFF2_CLUSTERID and AFF3 have non-zero values)
4549f3183d2SMingkai Hu	 *
4559f3183d2SMingkai Hu	 * LPID = MPIDR[15:8] | MPIDR[1:0]
4569f3183d2SMingkai Hu	 */
4579f3183d2SMingkai Hu	mrs	x0, mpidr_el1
4589f3183d2SMingkai Hu	ubfm	x1, x0, #8, #15
4599f3183d2SMingkai Hu	ubfm	x2, x0, #0, #1
4609f3183d2SMingkai Hu	orr	x10, x2, x1, lsl #2	/* x10 has LPID */
4619f3183d2SMingkai Hu	ubfm    x9, x0, #0, #15         /* x9 contains MPIDR[15:0] */
4629f3183d2SMingkai Hu	/*
4639f3183d2SMingkai Hu	 * offset of the spin table element for this core from start of spin
4649f3183d2SMingkai Hu	 * table (each elem is padded to 64 bytes)
4659f3183d2SMingkai Hu	 */
4669f3183d2SMingkai Hu	lsl	x1, x10, #6
4679f3183d2SMingkai Hu	ldr	x0, =__spin_table
4689f3183d2SMingkai Hu	/* physical address of this cpus spin table element */
4699f3183d2SMingkai Hu	add	x11, x1, x0
4709f3183d2SMingkai Hu
4719f3183d2SMingkai Hu	ldr	x0, =__real_cntfrq
4729f3183d2SMingkai Hu	ldr	x0, [x0]
4739f3183d2SMingkai Hu	msr	cntfrq_el0, x0	/* set with real frequency */
4749f3183d2SMingkai Hu	str	x9, [x11, #16]	/* LPID */
4759f3183d2SMingkai Hu	mov	x4, #1
4769f3183d2SMingkai Hu	str	x4, [x11, #8]	/* STATUS */
4779f3183d2SMingkai Hu	dsb	sy
4789f3183d2SMingkai Hu#if defined(CONFIG_GICV3)
4799f3183d2SMingkai Hu	gic_wait_for_interrupt_m x0
4809f3183d2SMingkai Hu#elif defined(CONFIG_GICV2)
481fa18ed76SWenbin Song	bl	get_gic_offset
482fa18ed76SWenbin Song	mov	x0, x1
4839f3183d2SMingkai Hu        gic_wait_for_interrupt_m x0, w1
4849f3183d2SMingkai Hu#endif
4859f3183d2SMingkai Hu
4869f3183d2SMingkai Huslave_cpu:
4879f3183d2SMingkai Hu	wfe
4889f3183d2SMingkai Hu	ldr	x0, [x11]
4899f3183d2SMingkai Hu	cbz	x0, slave_cpu
4909f3183d2SMingkai Hu#ifndef CONFIG_ARMV8_SWITCH_TO_EL1
4919f3183d2SMingkai Hu	mrs     x1, sctlr_el2
4929f3183d2SMingkai Hu#else
4939f3183d2SMingkai Hu	mrs     x1, sctlr_el1
4949f3183d2SMingkai Hu#endif
4959f3183d2SMingkai Hu	tbz     x1, #25, cpu_is_le
4969f3183d2SMingkai Hu	rev     x0, x0                  /* BE to LE conversion */
4979f3183d2SMingkai Hucpu_is_le:
498ec6617c3SAlison Wang	ldr	x5, [x11, #24]
499020b3ce8SAlison Wang	cbz	x5, 1f
500ec6617c3SAlison Wang
501ec6617c3SAlison Wang#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
5027c5e1febSAlison Wang	adr	x4, secondary_switch_to_el1
5037c5e1febSAlison Wang	ldr	x5, =ES_TO_AARCH64
504ec6617c3SAlison Wang#else
5057c5e1febSAlison Wang	ldr	x4, [x11]
5067c5e1febSAlison Wang	ldr	x5, =ES_TO_AARCH32
507ec6617c3SAlison Wang#endif
508ec6617c3SAlison Wang	bl	secondary_switch_to_el2
509ec6617c3SAlison Wang
510ec6617c3SAlison Wang1:
511ec6617c3SAlison Wang#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
5127c5e1febSAlison Wang	adr	x4, secondary_switch_to_el1
513ec6617c3SAlison Wang#else
5147c5e1febSAlison Wang	ldr	x4, [x11]
515ec6617c3SAlison Wang#endif
5167c5e1febSAlison Wang	ldr	x5, =ES_TO_AARCH64
517ec6617c3SAlison Wang	bl	secondary_switch_to_el2
518ec6617c3SAlison Wang
5199f3183d2SMingkai HuENDPROC(secondary_boot_func)
5209f3183d2SMingkai Hu
5219f3183d2SMingkai HuENTRY(secondary_switch_to_el2)
5227c5e1febSAlison Wang	switch_el x6, 1f, 0f, 0f
5239f3183d2SMingkai Hu0:	ret
5247c5e1febSAlison Wang1:	armv8_switch_to_el2_m x4, x5, x6
5259f3183d2SMingkai HuENDPROC(secondary_switch_to_el2)
5269f3183d2SMingkai Hu
5279f3183d2SMingkai HuENTRY(secondary_switch_to_el1)
528ec6617c3SAlison Wang	mrs	x0, mpidr_el1
529ec6617c3SAlison Wang	ubfm	x1, x0, #8, #15
530ec6617c3SAlison Wang	ubfm	x2, x0, #0, #1
531ec6617c3SAlison Wang	orr	x10, x2, x1, lsl #2	/* x10 has LPID */
532ec6617c3SAlison Wang
533ec6617c3SAlison Wang	lsl	x1, x10, #6
534ec6617c3SAlison Wang	ldr	x0, =__spin_table
535ec6617c3SAlison Wang	/* physical address of this cpus spin table element */
536ec6617c3SAlison Wang	add	x11, x1, x0
537ec6617c3SAlison Wang
5387c5e1febSAlison Wang	ldr	x4, [x11]
539ec6617c3SAlison Wang
540ec6617c3SAlison Wang	ldr	x5, [x11, #24]
541020b3ce8SAlison Wang	cbz	x5, 2f
542ec6617c3SAlison Wang
5437c5e1febSAlison Wang	ldr	x5, =ES_TO_AARCH32
544ec6617c3SAlison Wang	bl	switch_to_el1
545ec6617c3SAlison Wang
5467c5e1febSAlison Wang2:	ldr	x5, =ES_TO_AARCH64
547ec6617c3SAlison Wang
548ec6617c3SAlison Wangswitch_to_el1:
5497c5e1febSAlison Wang	switch_el x6, 0f, 1f, 0f
5509f3183d2SMingkai Hu0:	ret
5517c5e1febSAlison Wang1:	armv8_switch_to_el1_m x4, x5, x6
5529f3183d2SMingkai HuENDPROC(secondary_switch_to_el1)
5539f3183d2SMingkai Hu
5549f3183d2SMingkai Hu	/* Ensure that the literals used by the secondary boot code are
5559f3183d2SMingkai Hu	 * assembled within it (this is required so that we can protect
5569f3183d2SMingkai Hu	 * this area with a single memreserve region
5579f3183d2SMingkai Hu	 */
5589f3183d2SMingkai Hu	.ltorg
5599f3183d2SMingkai Hu
5609f3183d2SMingkai Hu	/* 64 bit alignment for elements accessed as data */
5619f3183d2SMingkai Hu	.align 4
5629f3183d2SMingkai Hu	.global __real_cntfrq
5639f3183d2SMingkai Hu__real_cntfrq:
5649f3183d2SMingkai Hu	.quad COUNTER_FREQUENCY
5659f3183d2SMingkai Hu	.globl __secondary_boot_code_size
5669f3183d2SMingkai Hu	.type __secondary_boot_code_size, %object
5679f3183d2SMingkai Hu	/* Secondary Boot Code ends here */
5689f3183d2SMingkai Hu__secondary_boot_code_size:
5699f3183d2SMingkai Hu	.quad .-secondary_boot_code
5709f3183d2SMingkai Hu#endif
571