diff options
Diffstat (limited to 'arch/powerpc/platforms')
-rw-r--r-- | arch/powerpc/platforms/85xx/smp.c | 6 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/interrupt.c | 16 | ||||
-rw-r--r-- | arch/powerpc/platforms/iseries/irq.c | 3 | ||||
-rw-r--r-- | arch/powerpc/platforms/iseries/smp.c | 23 | ||||
-rw-r--r-- | arch/powerpc/platforms/iseries/smp.h | 6 | ||||
-rw-r--r-- | arch/powerpc/platforms/powermac/smp.c | 27 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/smp.c | 3 | ||||
-rw-r--r-- | arch/powerpc/platforms/wsp/smp.c | 3 |
8 files changed, 32 insertions, 55 deletions
diff --git a/arch/powerpc/platforms/85xx/smp.c b/arch/powerpc/platforms/85xx/smp.c index fe3f6a3a5307..d6a93a10c0f5 100644 --- a/arch/powerpc/platforms/85xx/smp.c +++ b/arch/powerpc/platforms/85xx/smp.c | |||
@@ -235,8 +235,10 @@ void __init mpc85xx_smp_init(void) | |||
235 | smp_85xx_ops.message_pass = smp_mpic_message_pass; | 235 | smp_85xx_ops.message_pass = smp_mpic_message_pass; |
236 | } | 236 | } |
237 | 237 | ||
238 | if (cpu_has_feature(CPU_FTR_DBELL)) | 238 | if (cpu_has_feature(CPU_FTR_DBELL)) { |
239 | smp_85xx_ops.message_pass = doorbell_message_pass; | 239 | smp_85xx_ops.message_pass = smp_muxed_ipi_message_pass; |
240 | smp_85xx_ops.cause_ipi = doorbell_cause_ipi; | ||
241 | } | ||
240 | 242 | ||
241 | BUG_ON(!smp_85xx_ops.message_pass); | 243 | BUG_ON(!smp_85xx_ops.message_pass); |
242 | 244 | ||
diff --git a/arch/powerpc/platforms/cell/interrupt.c b/arch/powerpc/platforms/cell/interrupt.c index 44cfd1bef89b..6a58744d66c3 100644 --- a/arch/powerpc/platforms/cell/interrupt.c +++ b/arch/powerpc/platforms/cell/interrupt.c | |||
@@ -196,8 +196,20 @@ static irqreturn_t iic_ipi_action(int irq, void *dev_id) | |||
196 | { | 196 | { |
197 | int ipi = (int)(long)dev_id; | 197 | int ipi = (int)(long)dev_id; |
198 | 198 | ||
199 | smp_message_recv(ipi); | 199 | switch(ipi) { |
200 | 200 | case PPC_MSG_CALL_FUNCTION: | |
201 | generic_smp_call_function_interrupt(); | ||
202 | break; | ||
203 | case PPC_MSG_RESCHEDULE: | ||
204 | /* Upcoming sched hook */ | ||
205 | break; | ||
206 | case PPC_MSG_CALL_FUNC_SINGLE: | ||
207 | generic_smp_call_function_single_interrupt(); | ||
208 | break; | ||
209 | case PPC_MSG_DEBUGGER_BREAK: | ||
210 | debug_ipi_action(0, NULL); | ||
211 | break; | ||
212 | } | ||
201 | return IRQ_HANDLED; | 213 | return IRQ_HANDLED; |
202 | } | 214 | } |
203 | static void iic_request_ipi(int ipi, const char *name) | 215 | static void iic_request_ipi(int ipi, const char *name) |
diff --git a/arch/powerpc/platforms/iseries/irq.c b/arch/powerpc/platforms/iseries/irq.c index 375c21ca6602..b2103453eb01 100644 --- a/arch/powerpc/platforms/iseries/irq.c +++ b/arch/powerpc/platforms/iseries/irq.c | |||
@@ -42,7 +42,6 @@ | |||
42 | #include "irq.h" | 42 | #include "irq.h" |
43 | #include "pci.h" | 43 | #include "pci.h" |
44 | #include "call_pci.h" | 44 | #include "call_pci.h" |
45 | #include "smp.h" | ||
46 | 45 | ||
47 | #ifdef CONFIG_PCI | 46 | #ifdef CONFIG_PCI |
48 | 47 | ||
@@ -316,7 +315,7 @@ unsigned int iSeries_get_irq(void) | |||
316 | #ifdef CONFIG_SMP | 315 | #ifdef CONFIG_SMP |
317 | if (get_lppaca()->int_dword.fields.ipi_cnt) { | 316 | if (get_lppaca()->int_dword.fields.ipi_cnt) { |
318 | get_lppaca()->int_dword.fields.ipi_cnt = 0; | 317 | get_lppaca()->int_dword.fields.ipi_cnt = 0; |
319 | iSeries_smp_message_recv(); | 318 | smp_ipi_demux(); |
320 | } | 319 | } |
321 | #endif /* CONFIG_SMP */ | 320 | #endif /* CONFIG_SMP */ |
322 | if (hvlpevent_is_pending()) | 321 | if (hvlpevent_is_pending()) |
diff --git a/arch/powerpc/platforms/iseries/smp.c b/arch/powerpc/platforms/iseries/smp.c index dcdbc5dc5aad..e3265adde5d3 100644 --- a/arch/powerpc/platforms/iseries/smp.c +++ b/arch/powerpc/platforms/iseries/smp.c | |||
@@ -42,26 +42,8 @@ | |||
42 | #include <asm/cputable.h> | 42 | #include <asm/cputable.h> |
43 | #include <asm/system.h> | 43 | #include <asm/system.h> |
44 | 44 | ||
45 | #include "smp.h" | 45 | static void smp_iSeries_cause_ipi(int cpu, unsigned long data) |
46 | |||
47 | static unsigned long iSeries_smp_message[NR_CPUS]; | ||
48 | |||
49 | void iSeries_smp_message_recv(void) | ||
50 | { | ||
51 | int cpu = smp_processor_id(); | ||
52 | int msg; | ||
53 | |||
54 | if (num_online_cpus() < 2) | ||
55 | return; | ||
56 | |||
57 | for (msg = 0; msg < 4; msg++) | ||
58 | if (test_and_clear_bit(msg, &iSeries_smp_message[cpu])) | ||
59 | smp_message_recv(msg); | ||
60 | } | ||
61 | |||
62 | static void smp_iSeries_message_pass(int cpu, int msg) | ||
63 | { | 46 | { |
64 | set_bit(msg, &iSeries_smp_message[cpu]); | ||
65 | HvCall_sendIPI(&(paca[cpu])); | 47 | HvCall_sendIPI(&(paca[cpu])); |
66 | } | 48 | } |
67 | 49 | ||
@@ -93,7 +75,8 @@ static void __devinit smp_iSeries_setup_cpu(int nr) | |||
93 | } | 75 | } |
94 | 76 | ||
95 | static struct smp_ops_t iSeries_smp_ops = { | 77 | static struct smp_ops_t iSeries_smp_ops = { |
96 | .message_pass = smp_iSeries_message_pass, | 78 | .message_pass = smp_muxed_ipi_message_pass, |
79 | .cause_ipi = smp_iSeries_cause_ipi, | ||
97 | .probe = smp_iSeries_probe, | 80 | .probe = smp_iSeries_probe, |
98 | .kick_cpu = smp_iSeries_kick_cpu, | 81 | .kick_cpu = smp_iSeries_kick_cpu, |
99 | .setup_cpu = smp_iSeries_setup_cpu, | 82 | .setup_cpu = smp_iSeries_setup_cpu, |
diff --git a/arch/powerpc/platforms/iseries/smp.h b/arch/powerpc/platforms/iseries/smp.h deleted file mode 100644 index d501f7de01e7..000000000000 --- a/arch/powerpc/platforms/iseries/smp.h +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | #ifndef _PLATFORMS_ISERIES_SMP_H | ||
2 | #define _PLATFORMS_ISERIES_SMP_H | ||
3 | |||
4 | extern void iSeries_smp_message_recv(void); | ||
5 | |||
6 | #endif /* _PLATFORMS_ISERIES_SMP_H */ | ||
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c index c49e71926a54..a3401071abfb 100644 --- a/arch/powerpc/platforms/powermac/smp.c +++ b/arch/powerpc/platforms/powermac/smp.c | |||
@@ -156,28 +156,13 @@ static inline void psurge_clr_ipi(int cpu) | |||
156 | /* | 156 | /* |
157 | * On powersurge (old SMP powermac architecture) we don't have | 157 | * On powersurge (old SMP powermac architecture) we don't have |
158 | * separate IPIs for separate messages like openpic does. Instead | 158 | * separate IPIs for separate messages like openpic does. Instead |
159 | * we have a bitmap for each processor, where a 1 bit means that | 159 | * use the generic demux helpers |
160 | * the corresponding message is pending for that processor. | ||
161 | * Ideally each cpu's entry would be in a different cache line. | ||
162 | * -- paulus. | 160 | * -- paulus. |
163 | */ | 161 | */ |
164 | static unsigned long psurge_smp_message[NR_CPUS]; | ||
165 | |||
166 | void psurge_smp_message_recv(void) | 162 | void psurge_smp_message_recv(void) |
167 | { | 163 | { |
168 | int cpu = smp_processor_id(); | 164 | psurge_clr_ipi(smp_processor_id()); |
169 | int msg; | 165 | smp_ipi_demux(); |
170 | |||
171 | /* clear interrupt */ | ||
172 | psurge_clr_ipi(cpu); | ||
173 | |||
174 | if (num_online_cpus() < 2) | ||
175 | return; | ||
176 | |||
177 | /* make sure there is a message there */ | ||
178 | for (msg = 0; msg < 4; msg++) | ||
179 | if (test_and_clear_bit(msg, &psurge_smp_message[cpu])) | ||
180 | smp_message_recv(msg); | ||
181 | } | 166 | } |
182 | 167 | ||
183 | irqreturn_t psurge_primary_intr(int irq, void *d) | 168 | irqreturn_t psurge_primary_intr(int irq, void *d) |
@@ -186,9 +171,8 @@ irqreturn_t psurge_primary_intr(int irq, void *d) | |||
186 | return IRQ_HANDLED; | 171 | return IRQ_HANDLED; |
187 | } | 172 | } |
188 | 173 | ||
189 | static void smp_psurge_message_pass(int cpu, int msg) | 174 | static void smp_psurge_cause_ipi(int cpu, unsigned long data) |
190 | { | 175 | { |
191 | set_bit(msg, &psurge_smp_message[cpu]); | ||
192 | psurge_set_ipi(cpu); | 176 | psurge_set_ipi(cpu); |
193 | } | 177 | } |
194 | 178 | ||
@@ -428,7 +412,8 @@ void __init smp_psurge_give_timebase(void) | |||
428 | 412 | ||
429 | /* PowerSurge-style Macs */ | 413 | /* PowerSurge-style Macs */ |
430 | struct smp_ops_t psurge_smp_ops = { | 414 | struct smp_ops_t psurge_smp_ops = { |
431 | .message_pass = smp_psurge_message_pass, | 415 | .message_pass = smp_muxed_ipi_message_pass, |
416 | .cause_ipi = smp_psurge_cause_ipi, | ||
432 | .probe = smp_psurge_probe, | 417 | .probe = smp_psurge_probe, |
433 | .kick_cpu = smp_psurge_kick_cpu, | 418 | .kick_cpu = smp_psurge_kick_cpu, |
434 | .setup_cpu = smp_psurge_setup_cpu, | 419 | .setup_cpu = smp_psurge_setup_cpu, |
diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c index 95f578158ff0..fbffd7e47ab8 100644 --- a/arch/powerpc/platforms/pseries/smp.c +++ b/arch/powerpc/platforms/pseries/smp.c | |||
@@ -207,7 +207,8 @@ static struct smp_ops_t pSeries_mpic_smp_ops = { | |||
207 | }; | 207 | }; |
208 | 208 | ||
209 | static struct smp_ops_t pSeries_xics_smp_ops = { | 209 | static struct smp_ops_t pSeries_xics_smp_ops = { |
210 | .message_pass = NULL, /* Filled at runtime by xics_smp_probe() */ | 210 | .message_pass = smp_muxed_ipi_message_pass, |
211 | .cause_ipi = NULL, /* Filled at runtime by xics_smp_probe() */ | ||
211 | .probe = xics_smp_probe, | 212 | .probe = xics_smp_probe, |
212 | .kick_cpu = smp_pSeries_kick_cpu, | 213 | .kick_cpu = smp_pSeries_kick_cpu, |
213 | .setup_cpu = smp_xics_setup_cpu, | 214 | .setup_cpu = smp_xics_setup_cpu, |
diff --git a/arch/powerpc/platforms/wsp/smp.c b/arch/powerpc/platforms/wsp/smp.c index c7b8db9ed9b3..9d20fa9d3710 100644 --- a/arch/powerpc/platforms/wsp/smp.c +++ b/arch/powerpc/platforms/wsp/smp.c | |||
@@ -75,7 +75,8 @@ static int __init smp_a2_probe(void) | |||
75 | } | 75 | } |
76 | 76 | ||
77 | static struct smp_ops_t a2_smp_ops = { | 77 | static struct smp_ops_t a2_smp_ops = { |
78 | .message_pass = doorbell_message_pass, | 78 | .message_pass = smp_muxed_ipi_message_pass, |
79 | .cause_ipi = doorbell_cause_ipi, | ||
79 | .probe = smp_a2_probe, | 80 | .probe = smp_a2_probe, |
80 | .kick_cpu = smp_a2_kick_cpu, | 81 | .kick_cpu = smp_a2_kick_cpu, |
81 | .setup_cpu = smp_a2_setup_cpu, | 82 | .setup_cpu = smp_a2_setup_cpu, |