Merge tag 'xilinx-for-v2022.07-rc1' of https://source.denx.de/u-boot/custodians/u...
[platform/kernel/u-boot.git] / arch / arm / cpu / armv8 / fsl-layerscape / lowlevel.S
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * (C) Copyright 2014-2015 Freescale Semiconductor
4  * Copyright 2019 NXP
5  *
6  * Extracted from armv8/start.S
7  */
8
9 #include <config.h>
10 #include <linux/linkage.h>
11 #include <asm/gic.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>
16 #endif
17 #include <asm/u-boot.h>
18
19         .align 3
20         .weak secondary_boot_addr
21 secondary_boot_addr:
22         .quad 0
23
24 /* Get GIC offset
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
28 * with 64k.
29 * output:
30 *       x0: the base address of GICD
31 *       x1: the base address of GICC
32 */
33 ENTRY(get_gic_offset)
34         ldr     x0, =GICD_BASE
35 #ifdef CONFIG_GICV2
36         ldr     x1, =GICC_BASE
37 #endif
38 #ifdef CONFIG_HAS_FEATURE_GIC64K_ALIGN
39         ldr     x2, =DCFG_CCSR_SVR
40         ldr     w2, [x2]
41         rev     w2, w2
42         lsr     w3, w2, #16
43         ldr     w4, =SVR_DEV(SVR_LS1043A)
44         cmp     w3, w4
45         b.ne    1f
46         ands    w2, w2, #0xff
47         cmp     w2, #REV1_0
48         b.eq    1f
49         ldr     x2, =SCFG_GIC400_ALIGN
50         ldr     w2, [x2]
51         rev     w2, w2
52         tbnz    w2, #GIC_ADDR_BIT, 1f
53         ldr     x0, =GICD_BASE_64K
54 #ifdef CONFIG_GICV2
55         ldr     x1, =GICC_BASE_64K
56 #endif
57 1:
58 #endif
59         ret
60 ENDPROC(get_gic_offset)
61
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 */
66         bl      get_gic_offset
67         bl      gic_kick_secondary_cpus
68         mov     lr, x29                 /* Restore LR */
69 #endif
70         ret
71 ENDPROC(smp_kick_all_cpus)
72
73
74 ENTRY(lowlevel_init)
75         mov     x29, lr                 /* Save LR */
76
77         switch_el x1, 1f, 100f, 100f    /* skip if not in EL3 */
78 1:
79
80 #if defined (CONFIG_SYS_FSL_HAS_CCN504)
81
82         /* Set Wuo bit for RN-I 20 */
83 #ifdef CONFIG_ARCH_LS2080A
84         ldr     x0, =CCI_AUX_CONTROL_BASE(20)
85         ldr     x1, =0x00000010
86         bl      ccn504_set_aux
87
88         /*
89          * Set forced-order mode in RNI-6, RNI-20
90          * This is required for performance optimization on LS2088A
91          * LS2080A family does not support setting forced-order mode,
92          * so skip this operation for LS2080A family
93          */
94         bl      get_svr
95         lsr     w0, w0, #16
96         ldr     w1, =SVR_DEV(SVR_LS2080A)
97         cmp     w0, w1
98         b.eq    1f
99
100         ldr     x0, =CCI_AUX_CONTROL_BASE(6)
101         ldr     x1, =0x00000020
102         bl      ccn504_set_aux
103         ldr     x0, =CCI_AUX_CONTROL_BASE(20)
104         ldr     x1, =0x00000020
105         bl      ccn504_set_aux
106 1:
107 #endif
108
109         /* Add fully-coherent masters to DVM domain */
110         ldr     x0, =CCI_MN_BASE
111         ldr     x1, =CCI_MN_RNF_NODEID_LIST
112         ldr     x2, =CCI_MN_DVM_DOMAIN_CTL_SET
113         bl      ccn504_add_masters_to_dvm
114
115         /* Set all RN-I ports to QoS of 15 */
116         ldr     x0, =CCI_S0_QOS_CONTROL_BASE(0)
117         ldr     x1, =0x00FF000C
118         bl      ccn504_set_qos
119         ldr     x0, =CCI_S1_QOS_CONTROL_BASE(0)
120         ldr     x1, =0x00FF000C
121         bl      ccn504_set_qos
122         ldr     x0, =CCI_S2_QOS_CONTROL_BASE(0)
123         ldr     x1, =0x00FF000C
124         bl      ccn504_set_qos
125
126         ldr     x0, =CCI_S0_QOS_CONTROL_BASE(2)
127         ldr     x1, =0x00FF000C
128         bl      ccn504_set_qos
129         ldr     x0, =CCI_S1_QOS_CONTROL_BASE(2)
130         ldr     x1, =0x00FF000C
131         bl      ccn504_set_qos
132         ldr     x0, =CCI_S2_QOS_CONTROL_BASE(2)
133         ldr     x1, =0x00FF000C
134         bl      ccn504_set_qos
135
136         ldr     x0, =CCI_S0_QOS_CONTROL_BASE(6)
137         ldr     x1, =0x00FF000C
138         bl      ccn504_set_qos
139         ldr     x0, =CCI_S1_QOS_CONTROL_BASE(6)
140         ldr     x1, =0x00FF000C
141         bl      ccn504_set_qos
142         ldr     x0, =CCI_S2_QOS_CONTROL_BASE(6)
143         ldr     x1, =0x00FF000C
144         bl      ccn504_set_qos
145
146         ldr     x0, =CCI_S0_QOS_CONTROL_BASE(12)
147         ldr     x1, =0x00FF000C
148         bl      ccn504_set_qos
149         ldr     x0, =CCI_S1_QOS_CONTROL_BASE(12)
150         ldr     x1, =0x00FF000C
151         bl      ccn504_set_qos
152         ldr     x0, =CCI_S2_QOS_CONTROL_BASE(12)
153         ldr     x1, =0x00FF000C
154         bl      ccn504_set_qos
155
156         ldr     x0, =CCI_S0_QOS_CONTROL_BASE(16)
157         ldr     x1, =0x00FF000C
158         bl      ccn504_set_qos
159         ldr     x0, =CCI_S1_QOS_CONTROL_BASE(16)
160         ldr     x1, =0x00FF000C
161         bl      ccn504_set_qos
162         ldr     x0, =CCI_S2_QOS_CONTROL_BASE(16)
163         ldr     x1, =0x00FF000C
164         bl      ccn504_set_qos
165
166         ldr     x0, =CCI_S0_QOS_CONTROL_BASE(20)
167         ldr     x1, =0x00FF000C
168         bl      ccn504_set_qos
169         ldr     x0, =CCI_S1_QOS_CONTROL_BASE(20)
170         ldr     x1, =0x00FF000C
171         bl      ccn504_set_qos
172         ldr     x0, =CCI_S2_QOS_CONTROL_BASE(20)
173         ldr     x1, =0x00FF000C
174         bl      ccn504_set_qos
175 #endif /* CONFIG_SYS_FSL_HAS_CCN504 */
176
177 #ifdef SMMU_BASE
178         /* Set the SMMU page size in the sACR register */
179         ldr     x1, =SMMU_BASE
180         ldr     w0, [x1, #0x10]
181         orr     w0, w0, #1 << 16  /* set sACR.pagesize to indicate 64K page */
182         str     w0, [x1, #0x10]
183 #endif
184
185         /* Initialize GIC Secure Bank Status */
186 #if !defined(CONFIG_SPL_BUILD)
187 #if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
188         branch_if_slave x0, 1f
189         bl      get_gic_offset
190         bl      gic_init_secure
191 1:
192 #ifdef CONFIG_GICV3
193         ldr     x0, =GICR_BASE
194         bl      gic_init_secure_percpu
195 #elif defined(CONFIG_GICV2)
196         bl      get_gic_offset
197         bl      gic_init_secure_percpu
198 #endif
199 #endif
200 #endif
201
202 100:
203         branch_if_master x0, 2f
204
205 #if defined(CONFIG_MP) && defined(CONFIG_ARMV8_MULTIENTRY)
206         /*
207          * Formerly, here was a jump to secondary_boot_func, but we just
208          * return early here and let the generic code in start.S handle
209          * the jump to secondary_boot_func.
210          */
211         mov     lr, x29                 /* Restore LR */
212         ret
213 #endif
214
215 2:
216         switch_el x1, 1f, 100f, 100f    /* skip if not in EL3 */
217 1:
218 #ifdef CONFIG_FSL_TZPC_BP147
219         /* Set Non Secure access for all devices protected via TZPC */
220         ldr     x1, =TZPCDECPROT_0_SET_BASE /* Decode Protection-0 Set Reg */
221         orr     w0, w0, #1 << 3 /* DCFG_RESET is accessible from NS world */
222         str     w0, [x1]
223
224         isb
225         dsb     sy
226 #endif
227
228 #ifdef CONFIG_FSL_TZASC_400
229         /*
230          * LS2080 and its personalities does not support TZASC
231          * So skip TZASC related operations
232          */
233         bl      get_svr
234         lsr     w0, w0, #16
235         ldr     w1, =SVR_DEV(SVR_LS2080A)
236         cmp     w0, w1
237         b.eq    1f
238
239         /* Set TZASC so that:
240          * a. We use only Region0 whose global secure write/read is EN
241          * b. We use only Region0 whose NSAID write/read is EN
242          *
243          * NOTE: As per the CCSR map doc, TZASC 3 and TZASC 4 are just
244          *       placeholders.
245          */
246
247 .macro tzasc_prog, xreg
248
249         mov     x12, TZASC1_BASE
250         mov     x16, #0x10000
251         mul     x14, \xreg, x16
252         add     x14, x14,x12
253         mov     x1, #0x8
254         add     x1, x1, x14
255
256         ldr     w0, [x1]                /* Filter 0 Gate Keeper Register */
257         orr     w0, w0, #1 << 0         /* Set open_request for Filter 0 */
258         str     w0, [x1]
259
260         mov     x1, #0x110
261         add     x1, x1, x14
262
263         ldr     w0, [x1]                /* Region-0 Attributes Register */
264         orr     w0, w0, #1 << 31        /* Set Sec global write en, Bit[31] */
265         orr     w0, w0, #1 << 30        /* Set Sec global read en, Bit[30] */
266         str     w0, [x1]
267
268         mov     x1, #0x114
269         add     x1, x1, x14
270
271         ldr     w0, [x1]                /* Region-0 Access Register */
272         mov     w0, #0xFFFFFFFF         /* Set nsaid_wr_en and nsaid_rd_en */
273         str     w0, [x1]
274 .endm
275
276 #ifdef CONFIG_FSL_TZASC_1
277         mov     x13, #0
278         tzasc_prog      x13
279
280 #endif
281 #ifdef CONFIG_FSL_TZASC_2
282         mov     x13, #1
283         tzasc_prog      x13
284
285 #endif
286         isb
287         dsb     sy
288 #endif
289 100:
290 1:
291 #ifdef CONFIG_ARCH_LS1046A
292         switch_el x1, 1f, 100f, 100f    /* skip if not in EL3 */
293 1:
294         /* Initialize the L2 RAM latency */
295         mrs   x1, S3_1_c11_c0_2
296         mov   x0, #0x1C7
297         /* Clear L2 Tag RAM latency and L2 Data RAM latency */
298         bic   x1, x1, x0
299         /* Set L2 data ram latency bits [2:0] */
300         orr   x1, x1, #0x2
301         /* set L2 tag ram latency bits [8:6] */
302         orr   x1,  x1, #0x80
303         msr   S3_1_c11_c0_2, x1
304         isb
305 100:
306 #endif
307
308 #if !defined(CONFIG_TFABOOT) && \
309         (defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD))
310         bl      fsl_ocram_init
311 #endif
312
313         mov     lr, x29                 /* Restore LR */
314         ret
315 ENDPROC(lowlevel_init)
316
317 #if defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD)
318 ENTRY(fsl_ocram_init)
319         mov     x28, lr                 /* Save LR */
320         bl      fsl_clear_ocram
321         bl      fsl_ocram_clear_ecc_err
322         mov     lr, x28                 /* Restore LR */
323         ret
324 ENDPROC(fsl_ocram_init)
325
326 ENTRY(fsl_clear_ocram)
327 /* Clear OCRAM */
328         ldr     x0, =CONFIG_SYS_FSL_OCRAM_BASE
329         ldr     x1, =(CONFIG_SYS_FSL_OCRAM_BASE + CONFIG_SYS_FSL_OCRAM_SIZE)
330         mov     x2, #0
331 clear_loop:
332         str     x2, [x0]
333         add     x0, x0, #8
334         cmp     x0, x1
335         b.lo    clear_loop
336         ret
337 ENDPROC(fsl_clear_ocram)
338
339 ENTRY(fsl_ocram_clear_ecc_err)
340         /* OCRAM1/2 ECC status bit */
341         mov     w1, #0x60
342         ldr     x0, =DCSR_DCFG_SBEESR2
343         str     w1, [x0]
344         ldr     x0, =DCSR_DCFG_MBEESR2
345         str     w1, [x0]
346         ret
347 ENDPROC(fsl_ocram_init)
348 #endif
349
350 #ifdef CONFIG_FSL_LSCH3
351         .globl get_svr
352 get_svr:
353         ldr     x1, =FSL_LSCH3_SVR
354         ldr     w0, [x1]
355         ret
356 #endif
357
358 #if defined(CONFIG_SYS_FSL_HAS_CCN504) || defined(CONFIG_SYS_FSL_HAS_CCN508)
359 hnf_pstate_poll:
360         /* x0 has the desired status, return only if operation succeed
361          * clobber x1, x2, x6
362          */
363         mov     x1, x0
364         mov     w6, #8                  /* HN-F node count */
365         mov     x0, #0x18
366         movk    x0, #0x420, lsl #16     /* HNF0_PSTATE_STATUS */
367 1:
368         ldr     x2, [x0]
369         cmp     x2, x1                  /* check status */
370         b.eq    2f
371         b       1b
372 2:
373         add     x0, x0, #0x10000        /* move to next node */
374         subs    w6, w6, #1
375         cbnz    w6, 1b
376         ret
377
378 hnf_set_pstate:
379         /* x0 has the desired state, clobber x1, x2, x6 */
380         mov     x1, x0
381         /* power state to SFONLY */
382         mov     w6, #8                  /* HN-F node count */
383         mov     x0, #0x10
384         movk    x0, #0x420, lsl #16     /* HNF0_PSTATE_REQ */
385 1:      /* set pstate to sfonly */
386         ldr     x2, [x0]
387         and     x2, x2, #0xfffffffffffffffc     /* & HNFPSTAT_MASK */
388         orr     x2, x2, x1
389         str     x2, [x0]
390         add     x0, x0, #0x10000        /* move to next node */
391         subs    w6, w6, #1
392         cbnz    w6, 1b
393
394         ret
395
396 ENTRY(__asm_flush_l3_dcache)
397         /*
398          * Return status in x0
399          *    success 0
400          */
401         mov     x29, lr
402
403         dsb     sy
404         mov     x0, #0x1                /* HNFPSTAT_SFONLY */
405         bl      hnf_set_pstate
406
407         mov     x0, #0x4                /* SFONLY status */
408         bl      hnf_pstate_poll
409
410         dsb     sy
411         mov     x0, #0x3                /* HNFPSTAT_FAM */
412         bl      hnf_set_pstate
413
414         mov     x0, #0xc                /* FAM status */
415         bl      hnf_pstate_poll
416
417         mov     x0, #0
418         mov     lr, x29
419         ret
420 ENDPROC(__asm_flush_l3_dcache)
421 #endif /* CONFIG_SYS_FSL_HAS_CCN504 */