Commit | Line | Data |
---|---|---|
1c51ed4f MD |
1 | /* |
2 | * SMP support for R-Mobile / SH-Mobile | |
3 | * | |
4 | * Copyright (C) 2010 Magnus Damm | |
5 | * Copyright (C) 2010 Takashi Yoshii | |
6 | * | |
7 | * Based on vexpress, Copyright (c) 2003 ARM Limited, All Rights Reserved | |
8 | * | |
9 | * This program is free software; you can redistribute it and/or modify | |
10 | * it under the terms of the GNU General Public License version 2 as | |
11 | * published by the Free Software Foundation. | |
12 | */ | |
1c51ed4f | 13 | #include <linux/init.h> |
8b438bcb MD |
14 | #include <linux/linkage.h> |
15 | #include <linux/threads.h> | |
6ebbf2ce | 16 | #include <asm/assembler.h> |
6155f77d | 17 | #include <asm/memory.h> |
1c51ed4f | 18 | |
1c51ed4f MD |
19 | /* |
20 | * Reset vector for secondary CPUs. | |
21 | * This will be mapped at address 0 by SBAR register. | |
22 | * We need _long_ jump to the physical address. | |
23 | */ | |
c1d7e2e8 | 24 | .arm |
1c51ed4f | 25 | .align 12 |
ebe72ab9 MD |
26 | ENTRY(shmobile_boot_vector) |
27 | ldr r0, 2f | |
c1d7e2e8 TK |
28 | ldr r1, 1f |
29 | bx r1 | |
30 | ||
ebe72ab9 MD |
31 | ENDPROC(shmobile_boot_vector) |
32 | ||
0b933cb3 | 33 | .align 2 |
ebe72ab9 MD |
34 | .globl shmobile_boot_fn |
35 | shmobile_boot_fn: | |
36 | 1: .space 4 | |
37 | .globl shmobile_boot_arg | |
38 | shmobile_boot_arg: | |
39 | 2: .space 4 | |
a84a5ab7 MD |
40 | .globl shmobile_boot_size |
41 | shmobile_boot_size: | |
42 | .long . - shmobile_boot_vector | |
cc61591e MD |
43 | |
44 | /* | |
45 | * Per-CPU SMP boot function/argument selection code based on MPIDR | |
46 | */ | |
47 | ||
48 | ENTRY(shmobile_smp_boot) | |
49 | @ r0 = MPIDR_HWID_BITMASK | |
50 | mrc p15, 0, r1, c0, c0, 5 @ r1 = MPIDR | |
51 | and r0, r1, r0 @ r0 = cpu_logical_map() value | |
52 | mov r1, #0 @ r1 = CPU index | |
4e960f52 GU |
53 | adr r2, 1f |
54 | ldmia r2, {r5, r6, r7} | |
55 | add r5, r5, r2 @ array of per-cpu mpidr values | |
56 | add r6, r6, r2 @ array of per-cpu functions | |
57 | add r7, r7, r2 @ array of per-cpu arguments | |
cc61591e MD |
58 | |
59 | shmobile_smp_boot_find_mpidr: | |
60 | ldr r8, [r5, r1, lsl #2] | |
61 | cmp r8, r0 | |
62 | bne shmobile_smp_boot_next | |
63 | ||
64 | ldr r9, [r6, r1, lsl #2] | |
65 | cmp r9, #0 | |
66 | bne shmobile_smp_boot_found | |
67 | ||
68 | shmobile_smp_boot_next: | |
69 | add r1, r1, #1 | |
8b438bcb | 70 | cmp r1, #NR_CPUS |
cc61591e MD |
71 | blo shmobile_smp_boot_find_mpidr |
72 | ||
73 | b shmobile_smp_sleep | |
74 | ||
75 | shmobile_smp_boot_found: | |
76 | ldr r0, [r7, r1, lsl #2] | |
6ebbf2ce | 77 | ret r9 |
cc61591e MD |
78 | ENDPROC(shmobile_smp_boot) |
79 | ||
80 | ENTRY(shmobile_smp_sleep) | |
81 | wfi | |
82 | b shmobile_smp_boot | |
83 | ENDPROC(shmobile_smp_sleep) | |
84 | ||
4e960f52 GU |
85 | .align 2 |
86 | 1: .long shmobile_smp_mpidr - . | |
87 | .long shmobile_smp_fn - 1b | |
88 | .long shmobile_smp_arg - 1b | |
89 | ||
90 | .bss | |
cc61591e MD |
91 | .globl shmobile_smp_mpidr |
92 | shmobile_smp_mpidr: | |
4e960f52 | 93 | .space NR_CPUS * 4 |
cc61591e MD |
94 | .globl shmobile_smp_fn |
95 | shmobile_smp_fn: | |
4e960f52 | 96 | .space NR_CPUS * 4 |
cc61591e MD |
97 | .globl shmobile_smp_arg |
98 | shmobile_smp_arg: | |
4e960f52 | 99 | .space NR_CPUS * 4 |