Prepare v2022.04-rc5
[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         /* unmask SError and abort */
78         msr daifclr, #4
79
80         /* Set HCR_EL2[AMO] so SError @EL2 is taken */
81         mrs     x0, hcr_el2
82         orr     x0, x0, #0x20                   /* AMO */
83         msr     hcr_el2, x0
84         isb
85
86         switch_el x1, 1f, 100f, 100f    /* skip if not in EL3 */
87 1:
88
89 #if defined (CONFIG_SYS_FSL_HAS_CCN504)
90
91         /* Set Wuo bit for RN-I 20 */
92 #ifdef CONFIG_ARCH_LS2080A
93         ldr     x0, =CCI_AUX_CONTROL_BASE(20)
94         ldr     x1, =0x00000010
95         bl      ccn504_set_aux
96
97         /*
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
102          */
103         bl      get_svr
104         lsr     w0, w0, #16
105         ldr     w1, =SVR_DEV(SVR_LS2080A)
106         cmp     w0, w1
107         b.eq    1f
108
109         ldr     x0, =CCI_AUX_CONTROL_BASE(6)
110         ldr     x1, =0x00000020
111         bl      ccn504_set_aux
112         ldr     x0, =CCI_AUX_CONTROL_BASE(20)
113         ldr     x1, =0x00000020
114         bl      ccn504_set_aux
115 1:
116 #endif
117
118         /* Add fully-coherent masters to DVM domain */
119         ldr     x0, =CCI_MN_BASE
120         ldr     x1, =CCI_MN_RNF_NODEID_LIST
121         ldr     x2, =CCI_MN_DVM_DOMAIN_CTL_SET
122         bl      ccn504_add_masters_to_dvm
123
124         /* Set all RN-I ports to QoS of 15 */
125         ldr     x0, =CCI_S0_QOS_CONTROL_BASE(0)
126         ldr     x1, =0x00FF000C
127         bl      ccn504_set_qos
128         ldr     x0, =CCI_S1_QOS_CONTROL_BASE(0)
129         ldr     x1, =0x00FF000C
130         bl      ccn504_set_qos
131         ldr     x0, =CCI_S2_QOS_CONTROL_BASE(0)
132         ldr     x1, =0x00FF000C
133         bl      ccn504_set_qos
134
135         ldr     x0, =CCI_S0_QOS_CONTROL_BASE(2)
136         ldr     x1, =0x00FF000C
137         bl      ccn504_set_qos
138         ldr     x0, =CCI_S1_QOS_CONTROL_BASE(2)
139         ldr     x1, =0x00FF000C
140         bl      ccn504_set_qos
141         ldr     x0, =CCI_S2_QOS_CONTROL_BASE(2)
142         ldr     x1, =0x00FF000C
143         bl      ccn504_set_qos
144
145         ldr     x0, =CCI_S0_QOS_CONTROL_BASE(6)
146         ldr     x1, =0x00FF000C
147         bl      ccn504_set_qos
148         ldr     x0, =CCI_S1_QOS_CONTROL_BASE(6)
149         ldr     x1, =0x00FF000C
150         bl      ccn504_set_qos
151         ldr     x0, =CCI_S2_QOS_CONTROL_BASE(6)
152         ldr     x1, =0x00FF000C
153         bl      ccn504_set_qos
154
155         ldr     x0, =CCI_S0_QOS_CONTROL_BASE(12)
156         ldr     x1, =0x00FF000C
157         bl      ccn504_set_qos
158         ldr     x0, =CCI_S1_QOS_CONTROL_BASE(12)
159         ldr     x1, =0x00FF000C
160         bl      ccn504_set_qos
161         ldr     x0, =CCI_S2_QOS_CONTROL_BASE(12)
162         ldr     x1, =0x00FF000C
163         bl      ccn504_set_qos
164
165         ldr     x0, =CCI_S0_QOS_CONTROL_BASE(16)
166         ldr     x1, =0x00FF000C
167         bl      ccn504_set_qos
168         ldr     x0, =CCI_S1_QOS_CONTROL_BASE(16)
169         ldr     x1, =0x00FF000C
170         bl      ccn504_set_qos
171         ldr     x0, =CCI_S2_QOS_CONTROL_BASE(16)
172         ldr     x1, =0x00FF000C
173         bl      ccn504_set_qos
174
175         ldr     x0, =CCI_S0_QOS_CONTROL_BASE(20)
176         ldr     x1, =0x00FF000C
177         bl      ccn504_set_qos
178         ldr     x0, =CCI_S1_QOS_CONTROL_BASE(20)
179         ldr     x1, =0x00FF000C
180         bl      ccn504_set_qos
181         ldr     x0, =CCI_S2_QOS_CONTROL_BASE(20)
182         ldr     x1, =0x00FF000C
183         bl      ccn504_set_qos
184 #endif /* CONFIG_SYS_FSL_HAS_CCN504 */
185
186 #ifdef SMMU_BASE
187         /* Set the SMMU page size in the sACR register */
188         ldr     x1, =SMMU_BASE
189         ldr     w0, [x1, #0x10]
190         orr     w0, w0, #1 << 16  /* set sACR.pagesize to indicate 64K page */
191         str     w0, [x1, #0x10]
192 #endif
193
194         /* Initialize GIC Secure Bank Status */
195 #if !defined(CONFIG_SPL_BUILD)
196 #if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
197         branch_if_slave x0, 1f
198         bl      get_gic_offset
199         bl      gic_init_secure
200 1:
201 #ifdef CONFIG_GICV3
202         ldr     x0, =GICR_BASE
203         bl      gic_init_secure_percpu
204 #elif defined(CONFIG_GICV2)
205         bl      get_gic_offset
206         bl      gic_init_secure_percpu
207 #endif
208 #endif
209 #endif
210
211 100:
212         branch_if_master x0, x1, 2f
213
214 #if defined(CONFIG_MP) && defined(CONFIG_ARMV8_MULTIENTRY)
215         /*
216          * Formerly, here was a jump to secondary_boot_func, but we just
217          * return early here and let the generic code in start.S handle
218          * the jump to secondary_boot_func.
219          */
220         mov     lr, x29                 /* Restore LR */
221         ret
222 #endif
223
224 2:
225         switch_el x1, 1f, 100f, 100f    /* skip if not in EL3 */
226 1:
227 #ifdef CONFIG_FSL_TZPC_BP147
228         /* Set Non Secure access for all devices protected via TZPC */
229         ldr     x1, =TZPCDECPROT_0_SET_BASE /* Decode Protection-0 Set Reg */
230         orr     w0, w0, #1 << 3 /* DCFG_RESET is accessible from NS world */
231         str     w0, [x1]
232
233         isb
234         dsb     sy
235 #endif
236
237 #ifdef CONFIG_FSL_TZASC_400
238         /*
239          * LS2080 and its personalities does not support TZASC
240          * So skip TZASC related operations
241          */
242         bl      get_svr
243         lsr     w0, w0, #16
244         ldr     w1, =SVR_DEV(SVR_LS2080A)
245         cmp     w0, w1
246         b.eq    1f
247
248         /* Set TZASC so that:
249          * a. We use only Region0 whose global secure write/read is EN
250          * b. We use only Region0 whose NSAID write/read is EN
251          *
252          * NOTE: As per the CCSR map doc, TZASC 3 and TZASC 4 are just
253          *       placeholders.
254          */
255
256 .macro tzasc_prog, xreg
257
258         mov     x12, TZASC1_BASE
259         mov     x16, #0x10000
260         mul     x14, \xreg, x16
261         add     x14, x14,x12
262         mov     x1, #0x8
263         add     x1, x1, x14
264
265         ldr     w0, [x1]                /* Filter 0 Gate Keeper Register */
266         orr     w0, w0, #1 << 0         /* Set open_request for Filter 0 */
267         str     w0, [x1]
268
269         mov     x1, #0x110
270         add     x1, x1, x14
271
272         ldr     w0, [x1]                /* Region-0 Attributes Register */
273         orr     w0, w0, #1 << 31        /* Set Sec global write en, Bit[31] */
274         orr     w0, w0, #1 << 30        /* Set Sec global read en, Bit[30] */
275         str     w0, [x1]
276
277         mov     x1, #0x114
278         add     x1, x1, x14
279
280         ldr     w0, [x1]                /* Region-0 Access Register */
281         mov     w0, #0xFFFFFFFF         /* Set nsaid_wr_en and nsaid_rd_en */
282         str     w0, [x1]
283 .endm
284
285 #ifdef CONFIG_FSL_TZASC_1
286         mov     x13, #0
287         tzasc_prog      x13
288
289 #endif
290 #ifdef CONFIG_FSL_TZASC_2
291         mov     x13, #1
292         tzasc_prog      x13
293
294 #endif
295         isb
296         dsb     sy
297 #endif
298 100:
299 1:
300 #ifdef CONFIG_ARCH_LS1046A
301         switch_el x1, 1f, 100f, 100f    /* skip if not in EL3 */
302 1:
303         /* Initialize the L2 RAM latency */
304         mrs   x1, S3_1_c11_c0_2
305         mov   x0, #0x1C7
306         /* Clear L2 Tag RAM latency and L2 Data RAM latency */
307         bic   x1, x1, x0
308         /* Set L2 data ram latency bits [2:0] */
309         orr   x1, x1, #0x2
310         /* set L2 tag ram latency bits [8:6] */
311         orr   x1,  x1, #0x80
312         msr   S3_1_c11_c0_2, x1
313         isb
314 100:
315 #endif
316
317 #if !defined(CONFIG_TFABOOT) && \
318         (defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD))
319         bl      fsl_ocram_init
320 #endif
321
322         mov     lr, x29                 /* Restore LR */
323         ret
324 ENDPROC(lowlevel_init)
325
326 #if defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD)
327 ENTRY(fsl_ocram_init)
328         mov     x28, lr                 /* Save LR */
329         bl      fsl_clear_ocram
330         bl      fsl_ocram_clear_ecc_err
331         mov     lr, x28                 /* Restore LR */
332         ret
333 ENDPROC(fsl_ocram_init)
334
335 ENTRY(fsl_clear_ocram)
336 /* Clear OCRAM */
337         ldr     x0, =CONFIG_SYS_FSL_OCRAM_BASE
338         ldr     x1, =(CONFIG_SYS_FSL_OCRAM_BASE + CONFIG_SYS_FSL_OCRAM_SIZE)
339         mov     x2, #0
340 clear_loop:
341         str     x2, [x0]
342         add     x0, x0, #8
343         cmp     x0, x1
344         b.lo    clear_loop
345         ret
346 ENDPROC(fsl_clear_ocram)
347
348 ENTRY(fsl_ocram_clear_ecc_err)
349         /* OCRAM1/2 ECC status bit */
350         mov     w1, #0x60
351         ldr     x0, =DCSR_DCFG_SBEESR2
352         str     w1, [x0]
353         ldr     x0, =DCSR_DCFG_MBEESR2
354         str     w1, [x0]
355         ret
356 ENDPROC(fsl_ocram_init)
357 #endif
358
359 #ifdef CONFIG_FSL_LSCH3
360         .globl get_svr
361 get_svr:
362         ldr     x1, =FSL_LSCH3_SVR
363         ldr     w0, [x1]
364         ret
365 #endif
366
367 #if defined(CONFIG_SYS_FSL_HAS_CCN504) || defined(CONFIG_SYS_FSL_HAS_CCN508)
368 hnf_pstate_poll:
369         /* x0 has the desired status, return only if operation succeed
370          * clobber x1, x2, x6
371          */
372         mov     x1, x0
373         mov     w6, #8                  /* HN-F node count */
374         mov     x0, #0x18
375         movk    x0, #0x420, lsl #16     /* HNF0_PSTATE_STATUS */
376 1:
377         ldr     x2, [x0]
378         cmp     x2, x1                  /* check status */
379         b.eq    2f
380         b       1b
381 2:
382         add     x0, x0, #0x10000        /* move to next node */
383         subs    w6, w6, #1
384         cbnz    w6, 1b
385         ret
386
387 hnf_set_pstate:
388         /* x0 has the desired state, clobber x1, x2, x6 */
389         mov     x1, x0
390         /* power state to SFONLY */
391         mov     w6, #8                  /* HN-F node count */
392         mov     x0, #0x10
393         movk    x0, #0x420, lsl #16     /* HNF0_PSTATE_REQ */
394 1:      /* set pstate to sfonly */
395         ldr     x2, [x0]
396         and     x2, x2, #0xfffffffffffffffc     /* & HNFPSTAT_MASK */
397         orr     x2, x2, x1
398         str     x2, [x0]
399         add     x0, x0, #0x10000        /* move to next node */
400         subs    w6, w6, #1
401         cbnz    w6, 1b
402
403         ret
404
405 ENTRY(__asm_flush_l3_dcache)
406         /*
407          * Return status in x0
408          *    success 0
409          */
410         mov     x29, lr
411
412         dsb     sy
413         mov     x0, #0x1                /* HNFPSTAT_SFONLY */
414         bl      hnf_set_pstate
415
416         mov     x0, #0x4                /* SFONLY status */
417         bl      hnf_pstate_poll
418
419         dsb     sy
420         mov     x0, #0x3                /* HNFPSTAT_FAM */
421         bl      hnf_set_pstate
422
423         mov     x0, #0xc                /* FAM status */
424         bl      hnf_pstate_poll
425
426         mov     x0, #0
427         mov     lr, x29
428         ret
429 ENDPROC(__asm_flush_l3_dcache)
430 #endif /* CONFIG_SYS_FSL_HAS_CCN504 */