Merge https://gitlab.denx.de/u-boot/custodians/u-boot-fsl-qoriq
[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_GICV2) || defined(CONFIG_GICV3)
196         branch_if_slave x0, 1f
197         bl      get_gic_offset
198         bl      gic_init_secure
199 1:
200 #ifdef CONFIG_GICV3
201         ldr     x0, =GICR_BASE
202         bl      gic_init_secure_percpu
203 #elif defined(CONFIG_GICV2)
204         bl      get_gic_offset
205         bl      gic_init_secure_percpu
206 #endif
207 #endif
208
209 100:
210         branch_if_master x0, x1, 2f
211
212 #if defined(CONFIG_MP) && defined(CONFIG_ARMV8_MULTIENTRY)
213         /*
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.
217          */
218         mov     lr, x29                 /* Restore LR */
219         ret
220 #endif
221
222 2:
223         switch_el x1, 1f, 100f, 100f    /* skip if not in EL3 */
224 1:
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 */
229         str     w0, [x1]
230
231         isb
232         dsb     sy
233 #endif
234
235 #ifdef CONFIG_FSL_TZASC_400
236         /*
237          * LS2080 and its personalities does not support TZASC
238          * So skip TZASC related operations
239          */
240         bl      get_svr
241         lsr     w0, w0, #16
242         ldr     w1, =SVR_DEV(SVR_LS2080A)
243         cmp     w0, w1
244         b.eq    1f
245
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
249          *
250          * NOTE: As per the CCSR map doc, TZASC 3 and TZASC 4 are just
251          *       placeholders.
252          */
253
254 .macro tzasc_prog, xreg
255
256         mov     x12, TZASC1_BASE
257         mov     x16, #0x10000
258         mul     x14, \xreg, x16
259         add     x14, x14,x12
260         mov     x1, #0x8
261         add     x1, x1, x14
262
263         ldr     w0, [x1]                /* Filter 0 Gate Keeper Register */
264         orr     w0, w0, #1 << 0         /* Set open_request for Filter 0 */
265         str     w0, [x1]
266
267         mov     x1, #0x110
268         add     x1, x1, x14
269
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] */
273         str     w0, [x1]
274
275         mov     x1, #0x114
276         add     x1, x1, x14
277
278         ldr     w0, [x1]                /* Region-0 Access Register */
279         mov     w0, #0xFFFFFFFF         /* Set nsaid_wr_en and nsaid_rd_en */
280         str     w0, [x1]
281 .endm
282
283 #ifdef CONFIG_FSL_TZASC_1
284         mov     x13, #0
285         tzasc_prog      x13
286
287 #endif
288 #ifdef CONFIG_FSL_TZASC_2
289         mov     x13, #1
290         tzasc_prog      x13
291
292 #endif
293         isb
294         dsb     sy
295 #endif
296 100:
297 1:
298 #ifdef CONFIG_ARCH_LS1046A
299         switch_el x1, 1f, 100f, 100f    /* skip if not in EL3 */
300 1:
301         /* Initialize the L2 RAM latency */
302         mrs   x1, S3_1_c11_c0_2
303         mov   x0, #0x1C7
304         /* Clear L2 Tag RAM latency and L2 Data RAM latency */
305         bic   x1, x1, x0
306         /* Set L2 data ram latency bits [2:0] */
307         orr   x1, x1, #0x2
308         /* set L2 tag ram latency bits [8:6] */
309         orr   x1,  x1, #0x80
310         msr   S3_1_c11_c0_2, x1
311         isb
312 100:
313 #endif
314
315 #if !defined(CONFIG_TFABOOT) && \
316         (defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD))
317         bl      fsl_ocram_init
318 #endif
319
320         mov     lr, x29                 /* Restore LR */
321         ret
322 ENDPROC(lowlevel_init)
323
324 #if defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD)
325 ENTRY(fsl_ocram_init)
326         mov     x28, lr                 /* Save LR */
327         bl      fsl_clear_ocram
328         bl      fsl_ocram_clear_ecc_err
329         mov     lr, x28                 /* Restore LR */
330         ret
331 ENDPROC(fsl_ocram_init)
332
333 ENTRY(fsl_clear_ocram)
334 /* Clear OCRAM */
335         ldr     x0, =CONFIG_SYS_FSL_OCRAM_BASE
336         ldr     x1, =(CONFIG_SYS_FSL_OCRAM_BASE + CONFIG_SYS_FSL_OCRAM_SIZE)
337         mov     x2, #0
338 clear_loop:
339         str     x2, [x0]
340         add     x0, x0, #8
341         cmp     x0, x1
342         b.lo    clear_loop
343         ret
344 ENDPROC(fsl_clear_ocram)
345
346 ENTRY(fsl_ocram_clear_ecc_err)
347         /* OCRAM1/2 ECC status bit */
348         mov     w1, #0x60
349         ldr     x0, =DCSR_DCFG_SBEESR2
350         str     w1, [x0]
351         ldr     x0, =DCSR_DCFG_MBEESR2
352         str     w1, [x0]
353         ret
354 ENDPROC(fsl_ocram_init)
355 #endif
356
357 #ifdef CONFIG_FSL_LSCH3
358         .globl get_svr
359 get_svr:
360         ldr     x1, =FSL_LSCH3_SVR
361         ldr     w0, [x1]
362         ret
363 #endif
364
365 #if defined(CONFIG_SYS_FSL_HAS_CCN504) || defined(CONFIG_SYS_FSL_HAS_CCN508)
366 hnf_pstate_poll:
367         /* x0 has the desired status, return only if operation succeed
368          * clobber x1, x2, x6
369          */
370         mov     x1, x0
371         mov     w6, #8                  /* HN-F node count */
372         mov     x0, #0x18
373         movk    x0, #0x420, lsl #16     /* HNF0_PSTATE_STATUS */
374 1:
375         ldr     x2, [x0]
376         cmp     x2, x1                  /* check status */
377         b.eq    2f
378         b       1b
379 2:
380         add     x0, x0, #0x10000        /* move to next node */
381         subs    w6, w6, #1
382         cbnz    w6, 1b
383         ret
384
385 hnf_set_pstate:
386         /* x0 has the desired state, clobber x1, x2, x6 */
387         mov     x1, x0
388         /* power state to SFONLY */
389         mov     w6, #8                  /* HN-F node count */
390         mov     x0, #0x10
391         movk    x0, #0x420, lsl #16     /* HNF0_PSTATE_REQ */
392 1:      /* set pstate to sfonly */
393         ldr     x2, [x0]
394         and     x2, x2, #0xfffffffffffffffc     /* & HNFPSTAT_MASK */
395         orr     x2, x2, x1
396         str     x2, [x0]
397         add     x0, x0, #0x10000        /* move to next node */
398         subs    w6, w6, #1
399         cbnz    w6, 1b
400
401         ret
402
403 ENTRY(__asm_flush_l3_dcache)
404         /*
405          * Return status in x0
406          *    success 0
407          */
408         mov     x29, lr
409
410         dsb     sy
411         mov     x0, #0x1                /* HNFPSTAT_SFONLY */
412         bl      hnf_set_pstate
413
414         mov     x0, #0x4                /* SFONLY status */
415         bl      hnf_pstate_poll
416
417         dsb     sy
418         mov     x0, #0x3                /* HNFPSTAT_FAM */
419         bl      hnf_set_pstate
420
421         mov     x0, #0xc                /* FAM status */
422         bl      hnf_pstate_poll
423
424         mov     x0, #0
425         mov     lr, x29
426         ret
427 ENDPROC(__asm_flush_l3_dcache)
428 #endif /* CONFIG_SYS_FSL_HAS_CCN504 */