90dd4ea48e4f7353cb964ef405132c4f94d499a4
[platform/kernel/u-boot.git] / arch / arm / mach-mediatek / mt7629 / lowlevel_init.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2018 MediaTek Inc.
4  */
5
6 #include <linux/linkage.h>
7
8 ENTRY(lowlevel_init)
9
10 #ifndef CONFIG_SPL_BUILD
11         /* Return to U-Boot via saved link register */
12         mov     pc, lr
13 #else
14         /*
15          * Arch timer :
16          * set CNTFRQ = 20Mhz, set CNTVOFF = 0
17          */
18         movw    r0, #0x2d00
19         movt    r0, #0x131
20         mcr     p15, 0, r0, c14, c0, 0
21
22         /* enable SMP bit */
23         mrc     p15, 0, r0, c1, c0, 1
24         orr     r0, r0, #0x40
25         mcr     p15, 0, r0, c1, c0, 1
26
27         /* if MP core, handle secondary cores */
28         mrc     p15, 0, r0, c0, c0, 5
29         ands    r1, r0, #0x40000000
30         bne     go                      @ Go if UP
31         ands    r0, r0, #0x0f
32         beq     go                      @ Go if core0 on primary core tile
33         b       secondary
34
35 go:
36         /* master CPU */
37         mov     pc, lr
38
39 secondary:
40         /* read slave CPU number into r0 firstly */
41         mrc     p15, 0, r0, c0, c0, 5
42         and     r0, r0, #0x0f
43
44 loop:
45         dsb
46         isb
47         wfi                             @Zzz...
48         b       loop
49 #endif
50 ENDPROC(lowlevel_init)