Merge branch 'asoc-4.20' into asoc-linus
[sfrench/cifs-2.6.git] / arch / arm / mach-shmobile / headsmp.S
1 /* SPDX-License-Identifier: GPL-2.0
2  *
3  * SMP support for R-Mobile / SH-Mobile
4  *
5  * Copyright (C) 2010  Magnus Damm
6  * Copyright (C) 2010  Takashi Yoshii
7  *
8  * Based on vexpress, Copyright (c) 2003 ARM Limited, All Rights Reserved
9  */
10 #include <linux/init.h>
11 #include <linux/linkage.h>
12 #include <linux/threads.h>
13 #include <asm/assembler.h>
14 #include <asm/memory.h>
15
16 #define SCTLR_MMU       0x01
17 #define BOOTROM_ADDRESS 0xE6340000
18 #define RWTCSRA_ADDRESS 0xE6020004
19 #define RWTCSRA_WOVF    0x10
20
21 /*
22  * Reset vector for secondary CPUs.
23  * This will be mapped at address 0 by SBAR register.
24  * We need _long_ jump to the physical address.
25  */
26         .arm
27         .align  12
28 ENTRY(shmobile_boot_vector)
29         ldr     r1, 1f
30         bx      r1
31
32 ENDPROC(shmobile_boot_vector)
33
34         .align  2
35         .globl  shmobile_boot_fn
36 shmobile_boot_fn:
37 1:      .space  4
38         .globl  shmobile_boot_size
39 shmobile_boot_size:
40         .long   . - shmobile_boot_vector
41
42 #ifdef CONFIG_ARCH_RCAR_GEN2
43 /*
44  * Reset vector for R-Car Gen2 and RZ/G1 secondary CPUs.
45  * This will be mapped at address 0 by SBAR register.
46  */
47 ENTRY(shmobile_boot_vector_gen2)
48         mrc     p15, 0, r0, c0, c0, 5           @ r0 = MPIDR
49         ldr     r1, shmobile_boot_cpu_gen2
50         cmp     r0, r1
51         bne     shmobile_smp_continue_gen2
52
53         mrc     p15, 0, r1, c1, c0, 0           @ r1 = SCTLR
54         and     r0, r1, #SCTLR_MMU
55         cmp     r0, #SCTLR_MMU
56         beq     shmobile_smp_continue_gen2
57
58         ldr     r0, rwtcsra
59         mov     r1, #0
60         ldrb    r1, [r0]
61         and     r0, r1, #RWTCSRA_WOVF
62         cmp     r0, #RWTCSRA_WOVF
63         bne     shmobile_smp_continue_gen2
64
65         ldr     r0, bootrom
66         bx      r0
67
68 shmobile_smp_continue_gen2:
69         ldr     r1, shmobile_boot_fn_gen2
70         bx      r1
71
72 ENDPROC(shmobile_boot_vector_gen2)
73
74         .align  4
75 rwtcsra:
76         .word   RWTCSRA_ADDRESS
77 bootrom:
78         .word   BOOTROM_ADDRESS
79         .globl  shmobile_boot_cpu_gen2
80 shmobile_boot_cpu_gen2:
81         .word   0x00000000
82
83         .align  2
84         .globl  shmobile_boot_fn_gen2
85 shmobile_boot_fn_gen2:
86         .space  4
87         .globl  shmobile_boot_size_gen2
88 shmobile_boot_size_gen2:
89         .long   . - shmobile_boot_vector_gen2
90 #endif /* CONFIG_ARCH_RCAR_GEN2 */
91
92 /*
93  * Per-CPU SMP boot function/argument selection code based on MPIDR
94  */
95
96 ENTRY(shmobile_smp_boot)
97         mrc     p15, 0, r1, c0, c0, 5           @ r1 = MPIDR
98         and     r0, r1, #0xffffff               @ MPIDR_HWID_BITMASK
99                                                 @ r0 = cpu_logical_map() value
100         mov     r1, #0                          @ r1 = CPU index
101         adr     r2, 1f
102         ldmia   r2, {r5, r6, r7}
103         add     r5, r5, r2                      @ array of per-cpu mpidr values
104         add     r6, r6, r2                      @ array of per-cpu functions
105         add     r7, r7, r2                      @ array of per-cpu arguments
106
107 shmobile_smp_boot_find_mpidr:
108         ldr     r8, [r5, r1, lsl #2]
109         cmp     r8, r0
110         bne     shmobile_smp_boot_next
111
112         ldr     r9, [r6, r1, lsl #2]
113         cmp     r9, #0
114         bne     shmobile_smp_boot_found
115
116 shmobile_smp_boot_next:
117         add     r1, r1, #1
118         cmp     r1, #NR_CPUS
119         blo     shmobile_smp_boot_find_mpidr
120
121         b       shmobile_smp_sleep
122
123 shmobile_smp_boot_found:
124         ldr     r0, [r7, r1, lsl #2]
125         ret     r9
126 ENDPROC(shmobile_smp_boot)
127
128 ENTRY(shmobile_smp_sleep)
129         wfi
130         b       shmobile_smp_boot
131 ENDPROC(shmobile_smp_sleep)
132
133         .align  2
134 1:      .long   shmobile_smp_mpidr - .
135         .long   shmobile_smp_fn - 1b
136         .long   shmobile_smp_arg - 1b
137
138         .bss
139         .globl  shmobile_smp_mpidr
140 shmobile_smp_mpidr:
141         .space  NR_CPUS * 4
142         .globl  shmobile_smp_fn
143 shmobile_smp_fn:
144         .space  NR_CPUS * 4
145         .globl  shmobile_smp_arg
146 shmobile_smp_arg:
147         .space  NR_CPUS * 4