diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-01-06 17:31:35 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-01-06 17:32:03 -0500 |
commit | 4ec3eb13634529c0bc7466658d84d0bbe3244aea (patch) | |
tree | b491daac2ccfc7b8ca88e171a43f66888463568a /arch/arm/include | |
parent | 24056f525051a9e186af28904b396320e18bf9a0 (diff) | |
parent | 15095bb0fe779c0403091bda7adce5fb3bb9ca35 (diff) |
Merge branch 'smp' into misc
Conflicts:
arch/arm/kernel/entry-armv.S
arch/arm/mm/ioremap.c
Diffstat (limited to 'arch/arm/include')
-rw-r--r-- | arch/arm/include/asm/assembler.h | 24 | ||||
-rw-r--r-- | arch/arm/include/asm/entry-macro-multi.S | 2 | ||||
-rw-r--r-- | arch/arm/include/asm/hardirq.h | 18 | ||||
-rw-r--r-- | arch/arm/include/asm/hardware/it8152.h | 2 | ||||
-rw-r--r-- | arch/arm/include/asm/localtimer.h | 12 | ||||
-rw-r--r-- | arch/arm/include/asm/mach/irq.h | 2 | ||||
-rw-r--r-- | arch/arm/include/asm/mmu.h | 4 | ||||
-rw-r--r-- | arch/arm/include/asm/pgtable.h | 3 | ||||
-rw-r--r-- | arch/arm/include/asm/smp.h | 17 | ||||
-rw-r--r-- | arch/arm/include/asm/smp_mpidr.h | 17 | ||||
-rw-r--r-- | arch/arm/include/asm/smp_twd.h | 1 |
11 files changed, 57 insertions, 45 deletions
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 4e84d09c9c1..bc2d2d75f70 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
@@ -158,16 +158,24 @@ | |||
158 | #ifdef CONFIG_SMP | 158 | #ifdef CONFIG_SMP |
159 | #define ALT_SMP(instr...) \ | 159 | #define ALT_SMP(instr...) \ |
160 | 9998: instr | 160 | 9998: instr |
161 | /* | ||
162 | * Note: if you get assembler errors from ALT_UP() when building with | ||
163 | * CONFIG_THUMB2_KERNEL, you almost certainly need to use | ||
164 | * ALT_SMP( W(instr) ... ) | ||
165 | */ | ||
161 | #define ALT_UP(instr...) \ | 166 | #define ALT_UP(instr...) \ |
162 | .pushsection ".alt.smp.init", "a" ;\ | 167 | .pushsection ".alt.smp.init", "a" ;\ |
163 | .long 9998b ;\ | 168 | .long 9998b ;\ |
164 | instr ;\ | 169 | 9997: instr ;\ |
170 | .if . - 9997b != 4 ;\ | ||
171 | .error "ALT_UP() content must assemble to exactly 4 bytes";\ | ||
172 | .endif ;\ | ||
165 | .popsection | 173 | .popsection |
166 | #define ALT_UP_B(label) \ | 174 | #define ALT_UP_B(label) \ |
167 | .equ up_b_offset, label - 9998b ;\ | 175 | .equ up_b_offset, label - 9998b ;\ |
168 | .pushsection ".alt.smp.init", "a" ;\ | 176 | .pushsection ".alt.smp.init", "a" ;\ |
169 | .long 9998b ;\ | 177 | .long 9998b ;\ |
170 | b . + up_b_offset ;\ | 178 | W(b) . + up_b_offset ;\ |
171 | .popsection | 179 | .popsection |
172 | #else | 180 | #else |
173 | #define ALT_SMP(instr...) | 181 | #define ALT_SMP(instr...) |
@@ -178,16 +186,24 @@ | |||
178 | /* | 186 | /* |
179 | * SMP data memory barrier | 187 | * SMP data memory barrier |
180 | */ | 188 | */ |
181 | .macro smp_dmb | 189 | .macro smp_dmb mode |
182 | #ifdef CONFIG_SMP | 190 | #ifdef CONFIG_SMP |
183 | #if __LINUX_ARM_ARCH__ >= 7 | 191 | #if __LINUX_ARM_ARCH__ >= 7 |
192 | .ifeqs "\mode","arm" | ||
184 | ALT_SMP(dmb) | 193 | ALT_SMP(dmb) |
194 | .else | ||
195 | ALT_SMP(W(dmb)) | ||
196 | .endif | ||
185 | #elif __LINUX_ARM_ARCH__ == 6 | 197 | #elif __LINUX_ARM_ARCH__ == 6 |
186 | ALT_SMP(mcr p15, 0, r0, c7, c10, 5) @ dmb | 198 | ALT_SMP(mcr p15, 0, r0, c7, c10, 5) @ dmb |
187 | #else | 199 | #else |
188 | #error Incompatible SMP platform | 200 | #error Incompatible SMP platform |
189 | #endif | 201 | #endif |
202 | .ifeqs "\mode","arm" | ||
190 | ALT_UP(nop) | 203 | ALT_UP(nop) |
204 | .else | ||
205 | ALT_UP(W(nop)) | ||
206 | .endif | ||
191 | #endif | 207 | #endif |
192 | .endm | 208 | .endm |
193 | 209 | ||
@@ -239,7 +255,7 @@ | |||
239 | @ Slightly optimised to avoid incrementing the pointer twice | 255 | @ Slightly optimised to avoid incrementing the pointer twice |
240 | usraccoff \instr, \reg, \ptr, \inc, 0, \cond, \abort | 256 | usraccoff \instr, \reg, \ptr, \inc, 0, \cond, \abort |
241 | .if \rept == 2 | 257 | .if \rept == 2 |
242 | usraccoff \instr, \reg, \ptr, \inc, 4, \cond, \abort | 258 | usraccoff \instr, \reg, \ptr, \inc, \inc, \cond, \abort |
243 | .endif | 259 | .endif |
244 | 260 | ||
245 | add\cond \ptr, #\rept * \inc | 261 | add\cond \ptr, #\rept * \inc |
diff --git a/arch/arm/include/asm/entry-macro-multi.S b/arch/arm/include/asm/entry-macro-multi.S index 44f21d4584e..ec0bbf79c71 100644 --- a/arch/arm/include/asm/entry-macro-multi.S +++ b/arch/arm/include/asm/entry-macro-multi.S | |||
@@ -20,7 +20,7 @@ | |||
20 | */ | 20 | */ |
21 | ALT_SMP(test_for_ipi r0, r6, r5, lr) | 21 | ALT_SMP(test_for_ipi r0, r6, r5, lr) |
22 | ALT_UP_B(9997f) | 22 | ALT_UP_B(9997f) |
23 | movne r0, sp | 23 | movne r1, sp |
24 | adrne lr, BSYM(1b) | 24 | adrne lr, BSYM(1b) |
25 | bne do_IPI | 25 | bne do_IPI |
26 | 26 | ||
diff --git a/arch/arm/include/asm/hardirq.h b/arch/arm/include/asm/hardirq.h index 6d7485aff95..89ad1805e57 100644 --- a/arch/arm/include/asm/hardirq.h +++ b/arch/arm/include/asm/hardirq.h | |||
@@ -5,13 +5,31 @@ | |||
5 | #include <linux/threads.h> | 5 | #include <linux/threads.h> |
6 | #include <asm/irq.h> | 6 | #include <asm/irq.h> |
7 | 7 | ||
8 | #define NR_IPI 5 | ||
9 | |||
8 | typedef struct { | 10 | typedef struct { |
9 | unsigned int __softirq_pending; | 11 | unsigned int __softirq_pending; |
12 | #ifdef CONFIG_LOCAL_TIMERS | ||
10 | unsigned int local_timer_irqs; | 13 | unsigned int local_timer_irqs; |
14 | #endif | ||
15 | #ifdef CONFIG_SMP | ||
16 | unsigned int ipi_irqs[NR_IPI]; | ||
17 | #endif | ||
11 | } ____cacheline_aligned irq_cpustat_t; | 18 | } ____cacheline_aligned irq_cpustat_t; |
12 | 19 | ||
13 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ | 20 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ |
14 | 21 | ||
22 | #define __inc_irq_stat(cpu, member) __IRQ_STAT(cpu, member)++ | ||
23 | #define __get_irq_stat(cpu, member) __IRQ_STAT(cpu, member) | ||
24 | |||
25 | #ifdef CONFIG_SMP | ||
26 | u64 smp_irq_stat_cpu(unsigned int cpu); | ||
27 | #else | ||
28 | #define smp_irq_stat_cpu(cpu) 0 | ||
29 | #endif | ||
30 | |||
31 | #define arch_irq_stat_cpu smp_irq_stat_cpu | ||
32 | |||
15 | #if NR_IRQS > 512 | 33 | #if NR_IRQS > 512 |
16 | #define HARDIRQ_BITS 10 | 34 | #define HARDIRQ_BITS 10 |
17 | #elif NR_IRQS > 256 | 35 | #elif NR_IRQS > 256 |
diff --git a/arch/arm/include/asm/hardware/it8152.h b/arch/arm/include/asm/hardware/it8152.h index 6700c7fc7eb..21fa272301f 100644 --- a/arch/arm/include/asm/hardware/it8152.h +++ b/arch/arm/include/asm/hardware/it8152.h | |||
@@ -75,7 +75,7 @@ extern unsigned long it8152_base_address; | |||
75 | IT8152_PD_IRQ(1) USB (USBR) | 75 | IT8152_PD_IRQ(1) USB (USBR) |
76 | IT8152_PD_IRQ(0) Audio controller (ACR) | 76 | IT8152_PD_IRQ(0) Audio controller (ACR) |
77 | */ | 77 | */ |
78 | #define IT8152_IRQ(x) (IRQ_BOARD_END + (x)) | 78 | #define IT8152_IRQ(x) (IRQ_BOARD_START + (x)) |
79 | 79 | ||
80 | /* IRQ-sources in 3 groups - local devices, LPC (serial), and external PCI */ | 80 | /* IRQ-sources in 3 groups - local devices, LPC (serial), and external PCI */ |
81 | #define IT8152_LD_IRQ_COUNT 9 | 81 | #define IT8152_LD_IRQ_COUNT 9 |
diff --git a/arch/arm/include/asm/localtimer.h b/arch/arm/include/asm/localtimer.h index 50c7e7cfd67..6bc63ab498c 100644 --- a/arch/arm/include/asm/localtimer.h +++ b/arch/arm/include/asm/localtimer.h | |||
@@ -30,7 +30,6 @@ asmlinkage void do_local_timer(struct pt_regs *); | |||
30 | #include "smp_twd.h" | 30 | #include "smp_twd.h" |
31 | 31 | ||
32 | #define local_timer_ack() twd_timer_ack() | 32 | #define local_timer_ack() twd_timer_ack() |
33 | #define local_timer_stop() twd_timer_stop() | ||
34 | 33 | ||
35 | #else | 34 | #else |
36 | 35 | ||
@@ -40,11 +39,6 @@ asmlinkage void do_local_timer(struct pt_regs *); | |||
40 | */ | 39 | */ |
41 | int local_timer_ack(void); | 40 | int local_timer_ack(void); |
42 | 41 | ||
43 | /* | ||
44 | * Stop a local timer interrupt. | ||
45 | */ | ||
46 | void local_timer_stop(void); | ||
47 | |||
48 | #endif | 42 | #endif |
49 | 43 | ||
50 | /* | 44 | /* |
@@ -52,12 +46,6 @@ void local_timer_stop(void); | |||
52 | */ | 46 | */ |
53 | void local_timer_setup(struct clock_event_device *); | 47 | void local_timer_setup(struct clock_event_device *); |
54 | 48 | ||
55 | #else | ||
56 | |||
57 | static inline void local_timer_stop(void) | ||
58 | { | ||
59 | } | ||
60 | |||
61 | #endif | 49 | #endif |
62 | 50 | ||
63 | #endif | 51 | #endif |
diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h index 831e81453f8..22ac140edd9 100644 --- a/arch/arm/include/asm/mach/irq.h +++ b/arch/arm/include/asm/mach/irq.h | |||
@@ -18,7 +18,7 @@ struct seq_file; | |||
18 | * This is internal. Do not use it. | 18 | * This is internal. Do not use it. |
19 | */ | 19 | */ |
20 | extern void init_FIQ(void); | 20 | extern void init_FIQ(void); |
21 | extern int show_fiq_list(struct seq_file *, void *); | 21 | extern int show_fiq_list(struct seq_file *, int); |
22 | 22 | ||
23 | #ifdef CONFIG_MULTI_IRQ_HANDLER | 23 | #ifdef CONFIG_MULTI_IRQ_HANDLER |
24 | extern void (*handle_arch_irq)(struct pt_regs *); | 24 | extern void (*handle_arch_irq)(struct pt_regs *); |
diff --git a/arch/arm/include/asm/mmu.h b/arch/arm/include/asm/mmu.h index 68870c77667..b4ffe9d5b52 100644 --- a/arch/arm/include/asm/mmu.h +++ b/arch/arm/include/asm/mmu.h | |||
@@ -13,6 +13,10 @@ typedef struct { | |||
13 | 13 | ||
14 | #ifdef CONFIG_CPU_HAS_ASID | 14 | #ifdef CONFIG_CPU_HAS_ASID |
15 | #define ASID(mm) ((mm)->context.id & 255) | 15 | #define ASID(mm) ((mm)->context.id & 255) |
16 | |||
17 | /* init_mm.context.id_lock should be initialized. */ | ||
18 | #define INIT_MM_CONTEXT(name) \ | ||
19 | .context.id_lock = __SPIN_LOCK_UNLOCKED(name.context.id_lock), | ||
16 | #else | 20 | #else |
17 | #define ASID(mm) (0) | 21 | #define ASID(mm) (0) |
18 | #endif | 22 | #endif |
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index b155414192d..53d1d5deb11 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h | |||
@@ -374,6 +374,9 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd) | |||
374 | 374 | ||
375 | #define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd))) | 375 | #define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd))) |
376 | 376 | ||
377 | /* we don't need complex calculations here as the pmd is folded into the pgd */ | ||
378 | #define pmd_addr_end(addr,end) (end) | ||
379 | |||
377 | /* | 380 | /* |
378 | * Conversion functions: convert a page and protection to a page entry, | 381 | * Conversion functions: convert a page and protection to a page entry, |
379 | * and a page entry and page directory to the page they refer to. | 382 | * and a page entry and page directory to the page they refer to. |
diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h index 3d05190797c..96ed521f240 100644 --- a/arch/arm/include/asm/smp.h +++ b/arch/arm/include/asm/smp.h | |||
@@ -33,27 +33,23 @@ struct seq_file; | |||
33 | /* | 33 | /* |
34 | * generate IPI list text | 34 | * generate IPI list text |
35 | */ | 35 | */ |
36 | extern void show_ipi_list(struct seq_file *p); | 36 | extern void show_ipi_list(struct seq_file *, int); |
37 | 37 | ||
38 | /* | 38 | /* |
39 | * Called from assembly code, this handles an IPI. | 39 | * Called from assembly code, this handles an IPI. |
40 | */ | 40 | */ |
41 | asmlinkage void do_IPI(struct pt_regs *regs); | 41 | asmlinkage void do_IPI(int ipinr, struct pt_regs *regs); |
42 | 42 | ||
43 | /* | 43 | /* |
44 | * Setup the set of possible CPUs (via set_cpu_possible) | 44 | * Setup the set of possible CPUs (via set_cpu_possible) |
45 | */ | 45 | */ |
46 | extern void smp_init_cpus(void); | 46 | extern void smp_init_cpus(void); |
47 | 47 | ||
48 | /* | ||
49 | * Move global data into per-processor storage. | ||
50 | */ | ||
51 | extern void smp_store_cpu_info(unsigned int cpuid); | ||
52 | 48 | ||
53 | /* | 49 | /* |
54 | * Raise an IPI cross call on CPUs in callmap. | 50 | * Raise an IPI cross call on CPUs in callmap. |
55 | */ | 51 | */ |
56 | extern void smp_cross_call(const struct cpumask *mask); | 52 | extern void smp_cross_call(const struct cpumask *mask, int ipi); |
57 | 53 | ||
58 | /* | 54 | /* |
59 | * Boot a secondary CPU, and assign it the specified idle task. | 55 | * Boot a secondary CPU, and assign it the specified idle task. |
@@ -73,6 +69,11 @@ asmlinkage void secondary_start_kernel(void); | |||
73 | extern void platform_secondary_init(unsigned int cpu); | 69 | extern void platform_secondary_init(unsigned int cpu); |
74 | 70 | ||
75 | /* | 71 | /* |
72 | * Initialize cpu_possible map, and enable coherency | ||
73 | */ | ||
74 | extern void platform_smp_prepare_cpus(unsigned int); | ||
75 | |||
76 | /* | ||
76 | * Initial data for bringing up a secondary CPU. | 77 | * Initial data for bringing up a secondary CPU. |
77 | */ | 78 | */ |
78 | struct secondary_data { | 79 | struct secondary_data { |
@@ -97,6 +98,6 @@ extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); | |||
97 | /* | 98 | /* |
98 | * show local interrupt info | 99 | * show local interrupt info |
99 | */ | 100 | */ |
100 | extern void show_local_irqs(struct seq_file *); | 101 | extern void show_local_irqs(struct seq_file *, int); |
101 | 102 | ||
102 | #endif /* ifndef __ASM_ARM_SMP_H */ | 103 | #endif /* ifndef __ASM_ARM_SMP_H */ |
diff --git a/arch/arm/include/asm/smp_mpidr.h b/arch/arm/include/asm/smp_mpidr.h deleted file mode 100644 index 6a9307d6490..00000000000 --- a/arch/arm/include/asm/smp_mpidr.h +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | #ifndef ASMARM_SMP_MIDR_H | ||
2 | #define ASMARM_SMP_MIDR_H | ||
3 | |||
4 | #define hard_smp_processor_id() \ | ||
5 | ({ \ | ||
6 | unsigned int cpunum; \ | ||
7 | __asm__("\n" \ | ||
8 | "1: mrc p15, 0, %0, c0, c0, 5\n" \ | ||
9 | " .pushsection \".alt.smp.init\", \"a\"\n"\ | ||
10 | " .long 1b\n" \ | ||
11 | " mov %0, #0\n" \ | ||
12 | " .popsection" \ | ||
13 | : "=r" (cpunum)); \ | ||
14 | cpunum &= 0x0F; \ | ||
15 | }) | ||
16 | |||
17 | #endif | ||
diff --git a/arch/arm/include/asm/smp_twd.h b/arch/arm/include/asm/smp_twd.h index 634f357be6b..fed9981fba0 100644 --- a/arch/arm/include/asm/smp_twd.h +++ b/arch/arm/include/asm/smp_twd.h | |||
@@ -22,7 +22,6 @@ struct clock_event_device; | |||
22 | 22 | ||
23 | extern void __iomem *twd_base; | 23 | extern void __iomem *twd_base; |
24 | 24 | ||
25 | void twd_timer_stop(void); | ||
26 | int twd_timer_ack(void); | 25 | int twd_timer_ack(void); |
27 | void twd_timer_setup(struct clock_event_device *); | 26 | void twd_timer_setup(struct clock_event_device *); |
28 | 27 | ||