diff options
-rw-r--r-- | arch/powerpc/include/asm/smp.h | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/smp.c | 2 | ||||
-rw-r--r-- | arch/powerpc/platforms/Kconfig | 8 | ||||
-rw-r--r-- | arch/powerpc/platforms/Kconfig.cputype | 2 | ||||
-rw-r--r-- | arch/powerpc/platforms/iseries/Kconfig | 1 | ||||
-rw-r--r-- | arch/powerpc/platforms/powermac/Kconfig | 11 | ||||
-rw-r--r-- | arch/powerpc/platforms/powermac/pic.c | 4 | ||||
-rw-r--r-- | arch/powerpc/platforms/powermac/smp.c | 8 | ||||
-rw-r--r-- | arch/powerpc/sysdev/xics/Kconfig | 1 |
9 files changed, 32 insertions, 7 deletions
diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h index 26f861560c51..880b8c1e6e53 100644 --- a/arch/powerpc/include/asm/smp.h +++ b/arch/powerpc/include/asm/smp.h | |||
@@ -38,7 +38,9 @@ extern void cpu_die(void); | |||
38 | 38 | ||
39 | struct smp_ops_t { | 39 | struct smp_ops_t { |
40 | void (*message_pass)(int cpu, int msg); | 40 | void (*message_pass)(int cpu, int msg); |
41 | #ifdef CONFIG_PPC_SMP_MUXED_IPI | ||
41 | void (*cause_ipi)(int cpu, unsigned long data); | 42 | void (*cause_ipi)(int cpu, unsigned long data); |
43 | #endif | ||
42 | int (*probe)(void); | 44 | int (*probe)(void); |
43 | int (*kick_cpu)(int nr); | 45 | int (*kick_cpu)(int nr); |
44 | void (*setup_cpu)(int nr); | 46 | void (*setup_cpu)(int nr); |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index fa8e8700064b..d76f7d7929be 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
@@ -178,6 +178,7 @@ int smp_request_message_ipi(int virq, int msg) | |||
178 | return err; | 178 | return err; |
179 | } | 179 | } |
180 | 180 | ||
181 | #ifdef CONFIG_PPC_SMP_MUXED_IPI | ||
181 | struct cpu_messages { | 182 | struct cpu_messages { |
182 | unsigned long messages; /* current messages bits */ | 183 | unsigned long messages; /* current messages bits */ |
183 | unsigned long data; /* data for cause ipi */ | 184 | unsigned long data; /* data for cause ipi */ |
@@ -230,6 +231,7 @@ irqreturn_t smp_ipi_demux(void) | |||
230 | } | 231 | } |
231 | return IRQ_HANDLED; | 232 | return IRQ_HANDLED; |
232 | } | 233 | } |
234 | #endif /* CONFIG_PPC_SMP_MUXED_IPI */ | ||
233 | 235 | ||
234 | void smp_send_reschedule(int cpu) | 236 | void smp_send_reschedule(int cpu) |
235 | { | 237 | { |
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index 6059053e7158..83c704a637bb 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig | |||
@@ -57,6 +57,14 @@ config UDBG_RTAS_CONSOLE | |||
57 | depends on PPC_RTAS | 57 | depends on PPC_RTAS |
58 | default n | 58 | default n |
59 | 59 | ||
60 | config PPC_SMP_MUXED_IPI | ||
61 | bool | ||
62 | help | ||
63 | Select this opton if your platform supports SMP and your | ||
64 | interrupt controller provides less than 4 interrupts to each | ||
65 | cpu. This will enable the generic code to multiplex the 4 | ||
66 | messages on to one ipi. | ||
67 | |||
60 | config PPC_UDBG_BEAT | 68 | config PPC_UDBG_BEAT |
61 | bool "BEAT based debug console" | 69 | bool "BEAT based debug console" |
62 | depends on PPC_CELLEB | 70 | depends on PPC_CELLEB |
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index a1e623822a30..2165b65876f9 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype | |||
@@ -73,6 +73,7 @@ config PPC_BOOK3S_64 | |||
73 | config PPC_BOOK3E_64 | 73 | config PPC_BOOK3E_64 |
74 | bool "Embedded processors" | 74 | bool "Embedded processors" |
75 | select PPC_FPU # Make it a choice ? | 75 | select PPC_FPU # Make it a choice ? |
76 | select PPC_SMP_MUXED_IPI | ||
76 | 77 | ||
77 | endchoice | 78 | endchoice |
78 | 79 | ||
@@ -178,6 +179,7 @@ config FSL_BOOKE | |||
178 | config PPC_FSL_BOOK3E | 179 | config PPC_FSL_BOOK3E |
179 | bool | 180 | bool |
180 | select FSL_EMB_PERFMON | 181 | select FSL_EMB_PERFMON |
182 | select PPC_SMP_MUXED_IPI | ||
181 | default y if FSL_BOOKE | 183 | default y if FSL_BOOKE |
182 | 184 | ||
183 | config PTE_64BIT | 185 | config PTE_64BIT |
diff --git a/arch/powerpc/platforms/iseries/Kconfig b/arch/powerpc/platforms/iseries/Kconfig index ea1d3622b41c..b57cda3a0817 100644 --- a/arch/powerpc/platforms/iseries/Kconfig +++ b/arch/powerpc/platforms/iseries/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config PPC_ISERIES | 1 | config PPC_ISERIES |
2 | bool "IBM Legacy iSeries" | 2 | bool "IBM Legacy iSeries" |
3 | depends on PPC64 && PPC_BOOK3S | 3 | depends on PPC64 && PPC_BOOK3S |
4 | select PPC_SMP_MUXED_IPI | ||
4 | select PPC_INDIRECT_PIO | 5 | select PPC_INDIRECT_PIO |
5 | select PPC_INDIRECT_MMIO | 6 | select PPC_INDIRECT_MMIO |
6 | select PPC_PCI_CHOICE if EXPERT | 7 | select PPC_PCI_CHOICE if EXPERT |
diff --git a/arch/powerpc/platforms/powermac/Kconfig b/arch/powerpc/platforms/powermac/Kconfig index 1e1a0873e1dd..1afd10f67858 100644 --- a/arch/powerpc/platforms/powermac/Kconfig +++ b/arch/powerpc/platforms/powermac/Kconfig | |||
@@ -18,4 +18,13 @@ config PPC_PMAC64 | |||
18 | select PPC_970_NAP | 18 | select PPC_970_NAP |
19 | default y | 19 | default y |
20 | 20 | ||
21 | 21 | config PPC_PMAC32_PSURGE | |
22 | bool "Support for powersurge upgrade cards" if EXPERT | ||
23 | depends on SMP && PPC32 && PPC_PMAC | ||
24 | select PPC_SMP_MUXED_IPI | ||
25 | default y | ||
26 | help | ||
27 | The powersurge cpu boards can be used in the generation | ||
28 | of powermacs that have a socket for an upgradeable cpu card, | ||
29 | including the 7500, 8500, 9500, 9600. Support exists for | ||
30 | both dual and quad socket upgrade cards. | ||
diff --git a/arch/powerpc/platforms/powermac/pic.c b/arch/powerpc/platforms/powermac/pic.c index 2f34ad04029f..b706cb3ad99c 100644 --- a/arch/powerpc/platforms/powermac/pic.c +++ b/arch/powerpc/platforms/powermac/pic.c | |||
@@ -239,7 +239,7 @@ static unsigned int pmac_pic_get_irq(void) | |||
239 | unsigned long bits = 0; | 239 | unsigned long bits = 0; |
240 | unsigned long flags; | 240 | unsigned long flags; |
241 | 241 | ||
242 | #ifdef CONFIG_SMP | 242 | #ifdef CONFIG_PPC_PMAC32_PSURGE |
243 | void psurge_smp_message_recv(void); | 243 | void psurge_smp_message_recv(void); |
244 | 244 | ||
245 | /* IPI's are a hack on the powersurge -- Cort */ | 245 | /* IPI's are a hack on the powersurge -- Cort */ |
@@ -247,7 +247,7 @@ static unsigned int pmac_pic_get_irq(void) | |||
247 | psurge_smp_message_recv(); | 247 | psurge_smp_message_recv(); |
248 | return NO_IRQ_IGNORE; /* ignore, already handled */ | 248 | return NO_IRQ_IGNORE; /* ignore, already handled */ |
249 | } | 249 | } |
250 | #endif /* CONFIG_SMP */ | 250 | #endif /* CONFIG_PPC_PMAC32_PSURGE */ |
251 | raw_spin_lock_irqsave(&pmac_pic_lock, flags); | 251 | raw_spin_lock_irqsave(&pmac_pic_lock, flags); |
252 | for (irq = max_real_irqs; (irq -= 32) >= 0; ) { | 252 | for (irq = max_real_irqs; (irq -= 32) >= 0; ) { |
253 | int i = irq >> 5; | 253 | int i = irq >> 5; |
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c index a3401071abfb..67b6e1432be2 100644 --- a/arch/powerpc/platforms/powermac/smp.c +++ b/arch/powerpc/platforms/powermac/smp.c | |||
@@ -70,7 +70,7 @@ static void (*pmac_tb_freeze)(int freeze); | |||
70 | static u64 timebase; | 70 | static u64 timebase; |
71 | static int tb_req; | 71 | static int tb_req; |
72 | 72 | ||
73 | #ifdef CONFIG_PPC32 | 73 | #ifdef CONFIG_PPC_PMAC32_PSURGE |
74 | 74 | ||
75 | /* | 75 | /* |
76 | * Powersurge (old powermac SMP) support. | 76 | * Powersurge (old powermac SMP) support. |
@@ -420,7 +420,7 @@ struct smp_ops_t psurge_smp_ops = { | |||
420 | .give_timebase = smp_psurge_give_timebase, | 420 | .give_timebase = smp_psurge_give_timebase, |
421 | .take_timebase = smp_psurge_take_timebase, | 421 | .take_timebase = smp_psurge_take_timebase, |
422 | }; | 422 | }; |
423 | #endif /* CONFIG_PPC32 - actually powersurge support */ | 423 | #endif /* CONFIG_PPC_PMAC32_PSURGE */ |
424 | 424 | ||
425 | /* | 425 | /* |
426 | * Core 99 and later support | 426 | * Core 99 and later support |
@@ -980,7 +980,7 @@ void __init pmac_setup_smp(void) | |||
980 | of_node_put(np); | 980 | of_node_put(np); |
981 | smp_ops = &core99_smp_ops; | 981 | smp_ops = &core99_smp_ops; |
982 | } | 982 | } |
983 | #ifdef CONFIG_PPC32 | 983 | #ifdef CONFIG_PPC_PMAC32_PSURGE |
984 | else { | 984 | else { |
985 | /* We have to set bits in cpu_possible_mask here since the | 985 | /* We have to set bits in cpu_possible_mask here since the |
986 | * secondary CPU(s) aren't in the device tree. Various | 986 | * secondary CPU(s) aren't in the device tree. Various |
@@ -993,7 +993,7 @@ void __init pmac_setup_smp(void) | |||
993 | set_cpu_possible(cpu, true); | 993 | set_cpu_possible(cpu, true); |
994 | smp_ops = &psurge_smp_ops; | 994 | smp_ops = &psurge_smp_ops; |
995 | } | 995 | } |
996 | #endif /* CONFIG_PPC32 */ | 996 | #endif /* CONFIG_PPC_PMAC32_PSURGE */ |
997 | 997 | ||
998 | #ifdef CONFIG_HOTPLUG_CPU | 998 | #ifdef CONFIG_HOTPLUG_CPU |
999 | ppc_md.cpu_die = pmac_cpu_die; | 999 | ppc_md.cpu_die = pmac_cpu_die; |
diff --git a/arch/powerpc/sysdev/xics/Kconfig b/arch/powerpc/sysdev/xics/Kconfig index 123b8ddf2816..0031eda320c3 100644 --- a/arch/powerpc/sysdev/xics/Kconfig +++ b/arch/powerpc/sysdev/xics/Kconfig | |||
@@ -1,5 +1,6 @@ | |||
1 | config PPC_XICS | 1 | config PPC_XICS |
2 | def_bool n | 2 | def_bool n |
3 | select PPC_SMP_MUXED_IPI | ||
3 | 4 | ||
4 | config PPC_ICP_NATIVE | 5 | config PPC_ICP_NATIVE |
5 | def_bool n | 6 | def_bool n |