1 /* SPDX-License-Identifier: GPL-2.0+ */
3 * (C) Copyright 2014-2015 Freescale Semiconductor
6 * Extracted from armv8/start.S
10 #include <linux/linkage.h>
12 #include <asm/macro.h>
13 #include <asm/arch-fsl-layerscape/soc.h>
14 #ifdef CONFIG_FSL_LSCH3
15 #include <asm/arch-fsl-layerscape/immap_lsch3.h>
17 #include <asm/u-boot.h>
20 .weak secondary_boot_addr
25 * For LS1043a rev1.0, GIC base address align with 4k.
26 * For LS1043a rev1.1, if DCFG_GIC400_ALIGN[GIC_ADDR_BIT]
27 * is set, GIC base address align with 4K, or else align
30 * x0: the base address of GICD
31 * x1: the base address of GICC
38 #ifdef CONFIG_HAS_FEATURE_GIC64K_ALIGN
39 ldr x2, =DCFG_CCSR_SVR
43 ldr w4, =SVR_DEV(SVR_LS1043A)
49 ldr x2, =SCFG_GIC400_ALIGN
52 tbnz w2, #GIC_ADDR_BIT, 1f
53 ldr x0, =GICD_BASE_64K
55 ldr x1, =GICC_BASE_64K
60 ENDPROC(get_gic_offset)
62 ENTRY(smp_kick_all_cpus)
63 /* Kick secondary cpus up by SGI 0 interrupt */
64 #if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
65 mov x29, lr /* Save LR */
67 bl gic_kick_secondary_cpus
68 mov lr, x29 /* Restore LR */
71 ENDPROC(smp_kick_all_cpus)
75 mov x29, lr /* Save LR */
77 /* unmask SError and abort */
80 /* Set HCR_EL2[AMO] so SError @EL2 is taken */
82 orr x0, x0, #0x20 /* AMO */
86 switch_el x1, 1f, 100f, 100f /* skip if not in EL3 */
89 #if defined (CONFIG_SYS_FSL_HAS_CCN504)
91 /* Set Wuo bit for RN-I 20 */
92 #ifdef CONFIG_ARCH_LS2080A
93 ldr x0, =CCI_AUX_CONTROL_BASE(20)
98 * Set forced-order mode in RNI-6, RNI-20
99 * This is required for performance optimization on LS2088A
100 * LS2080A family does not support setting forced-order mode,
101 * so skip this operation for LS2080A family
105 ldr w1, =SVR_DEV(SVR_LS2080A)
109 ldr x0, =CCI_AUX_CONTROL_BASE(6)
112 ldr x0, =CCI_AUX_CONTROL_BASE(20)
118 /* Add fully-coherent masters to DVM domain */
120 ldr x1, =CCI_MN_RNF_NODEID_LIST
121 ldr x2, =CCI_MN_DVM_DOMAIN_CTL_SET
122 bl ccn504_add_masters_to_dvm
124 /* Set all RN-I ports to QoS of 15 */
125 ldr x0, =CCI_S0_QOS_CONTROL_BASE(0)
128 ldr x0, =CCI_S1_QOS_CONTROL_BASE(0)
131 ldr x0, =CCI_S2_QOS_CONTROL_BASE(0)
135 ldr x0, =CCI_S0_QOS_CONTROL_BASE(2)
138 ldr x0, =CCI_S1_QOS_CONTROL_BASE(2)
141 ldr x0, =CCI_S2_QOS_CONTROL_BASE(2)
145 ldr x0, =CCI_S0_QOS_CONTROL_BASE(6)
148 ldr x0, =CCI_S1_QOS_CONTROL_BASE(6)
151 ldr x0, =CCI_S2_QOS_CONTROL_BASE(6)
155 ldr x0, =CCI_S0_QOS_CONTROL_BASE(12)
158 ldr x0, =CCI_S1_QOS_CONTROL_BASE(12)
161 ldr x0, =CCI_S2_QOS_CONTROL_BASE(12)
165 ldr x0, =CCI_S0_QOS_CONTROL_BASE(16)
168 ldr x0, =CCI_S1_QOS_CONTROL_BASE(16)
171 ldr x0, =CCI_S2_QOS_CONTROL_BASE(16)
175 ldr x0, =CCI_S0_QOS_CONTROL_BASE(20)
178 ldr x0, =CCI_S1_QOS_CONTROL_BASE(20)
181 ldr x0, =CCI_S2_QOS_CONTROL_BASE(20)
184 #endif /* CONFIG_SYS_FSL_HAS_CCN504 */
187 /* Set the SMMU page size in the sACR register */
190 orr w0, w0, #1 << 16 /* set sACR.pagesize to indicate 64K page */
194 /* Initialize GIC Secure Bank Status */
195 #if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
196 branch_if_slave x0, 1f
202 bl gic_init_secure_percpu
203 #elif defined(CONFIG_GICV2)
205 bl gic_init_secure_percpu
210 branch_if_master x0, x1, 2f
212 #if defined(CONFIG_MP) && defined(CONFIG_ARMV8_MULTIENTRY)
214 * Formerly, here was a jump to secondary_boot_func, but we just
215 * return early here and let the generic code in start.S handle
216 * the jump to secondary_boot_func.
218 mov lr, x29 /* Restore LR */
223 switch_el x1, 1f, 100f, 100f /* skip if not in EL3 */
225 #ifdef CONFIG_FSL_TZPC_BP147
226 /* Set Non Secure access for all devices protected via TZPC */
227 ldr x1, =TZPCDECPROT_0_SET_BASE /* Decode Protection-0 Set Reg */
228 orr w0, w0, #1 << 3 /* DCFG_RESET is accessible from NS world */
235 #ifdef CONFIG_FSL_TZASC_400
237 * LS2080 and its personalities does not support TZASC
238 * So skip TZASC related operations
242 ldr w1, =SVR_DEV(SVR_LS2080A)
246 /* Set TZASC so that:
247 * a. We use only Region0 whose global secure write/read is EN
248 * b. We use only Region0 whose NSAID write/read is EN
250 * NOTE: As per the CCSR map doc, TZASC 3 and TZASC 4 are just
254 .macro tzasc_prog, xreg
263 ldr w0, [x1] /* Filter 0 Gate Keeper Register */
264 orr w0, w0, #1 << 0 /* Set open_request for Filter 0 */
270 ldr w0, [x1] /* Region-0 Attributes Register */
271 orr w0, w0, #1 << 31 /* Set Sec global write en, Bit[31] */
272 orr w0, w0, #1 << 30 /* Set Sec global read en, Bit[30] */
278 ldr w0, [x1] /* Region-0 Access Register */
279 mov w0, #0xFFFFFFFF /* Set nsaid_wr_en and nsaid_rd_en */
283 #ifdef CONFIG_FSL_TZASC_1
288 #ifdef CONFIG_FSL_TZASC_2
298 #ifdef CONFIG_ARCH_LS1046A
299 switch_el x1, 1f, 100f, 100f /* skip if not in EL3 */
301 /* Initialize the L2 RAM latency */
302 mrs x1, S3_1_c11_c0_2
304 /* Clear L2 Tag RAM latency and L2 Data RAM latency */
306 /* Set L2 data ram latency bits [2:0] */
308 /* set L2 tag ram latency bits [8:6] */
310 msr S3_1_c11_c0_2, x1
315 #if !defined(CONFIG_TFABOOT) && \
316 (defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD))
320 mov lr, x29 /* Restore LR */
322 ENDPROC(lowlevel_init)
324 #if defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD)
325 ENTRY(fsl_ocram_init)
326 mov x28, lr /* Save LR */
328 bl fsl_ocram_clear_ecc_err
329 mov lr, x28 /* Restore LR */
331 ENDPROC(fsl_ocram_init)
333 ENTRY(fsl_clear_ocram)
335 ldr x0, =CONFIG_SYS_FSL_OCRAM_BASE
336 ldr x1, =(CONFIG_SYS_FSL_OCRAM_BASE + CONFIG_SYS_FSL_OCRAM_SIZE)
344 ENDPROC(fsl_clear_ocram)
346 ENTRY(fsl_ocram_clear_ecc_err)
347 /* OCRAM1/2 ECC status bit */
349 ldr x0, =DCSR_DCFG_SBEESR2
351 ldr x0, =DCSR_DCFG_MBEESR2
354 ENDPROC(fsl_ocram_init)
357 #ifdef CONFIG_FSL_LSCH3
360 ldr x1, =FSL_LSCH3_SVR
365 #if defined(CONFIG_SYS_FSL_HAS_CCN504) || defined(CONFIG_SYS_FSL_HAS_CCN508)
367 /* x0 has the desired status, return only if operation succeed
371 mov w6, #8 /* HN-F node count */
373 movk x0, #0x420, lsl #16 /* HNF0_PSTATE_STATUS */
376 cmp x2, x1 /* check status */
380 add x0, x0, #0x10000 /* move to next node */
386 /* x0 has the desired state, clobber x1, x2, x6 */
388 /* power state to SFONLY */
389 mov w6, #8 /* HN-F node count */
391 movk x0, #0x420, lsl #16 /* HNF0_PSTATE_REQ */
392 1: /* set pstate to sfonly */
394 and x2, x2, #0xfffffffffffffffc /* & HNFPSTAT_MASK */
397 add x0, x0, #0x10000 /* move to next node */
403 ENTRY(__asm_flush_l3_dcache)
405 * Return status in x0
411 mov x0, #0x1 /* HNFPSTAT_SFONLY */
414 mov x0, #0x4 /* SFONLY status */
418 mov x0, #0x3 /* HNFPSTAT_FAM */
421 mov x0, #0xc /* FAM status */
427 ENDPROC(__asm_flush_l3_dcache)
428 #endif /* CONFIG_SYS_FSL_HAS_CCN504 */