aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/powermac/smp.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/platforms/powermac/smp.c')
-rw-r--r--arch/powerpc/platforms/powermac/smp.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c
index 1949b657b092..eeb2ae5ffc58 100644
--- a/arch/powerpc/platforms/powermac/smp.c
+++ b/arch/powerpc/platforms/powermac/smp.c
@@ -160,7 +160,7 @@ static inline void psurge_clr_ipi(int cpu)
160 */ 160 */
161static unsigned long psurge_smp_message[NR_CPUS]; 161static unsigned long psurge_smp_message[NR_CPUS];
162 162
163void psurge_smp_message_recv(struct pt_regs *regs) 163void psurge_smp_message_recv(void)
164{ 164{
165 int cpu = smp_processor_id(); 165 int cpu = smp_processor_id();
166 int msg; 166 int msg;
@@ -174,12 +174,12 @@ void psurge_smp_message_recv(struct pt_regs *regs)
174 /* make sure there is a message there */ 174 /* make sure there is a message there */
175 for (msg = 0; msg < 4; msg++) 175 for (msg = 0; msg < 4; msg++)
176 if (test_and_clear_bit(msg, &psurge_smp_message[cpu])) 176 if (test_and_clear_bit(msg, &psurge_smp_message[cpu]))
177 smp_message_recv(msg, regs); 177 smp_message_recv(msg);
178} 178}
179 179
180irqreturn_t psurge_primary_intr(int irq, void *d, struct pt_regs *regs) 180irqreturn_t psurge_primary_intr(int irq, void *d)
181{ 181{
182 psurge_smp_message_recv(regs); 182 psurge_smp_message_recv();
183 return IRQ_HANDLED; 183 return IRQ_HANDLED;
184} 184}
185 185
@@ -328,6 +328,7 @@ static void __init smp_psurge_kick_cpu(int nr)
328{ 328{
329 unsigned long start = __pa(__secondary_start_pmac_0) + nr * 8; 329 unsigned long start = __pa(__secondary_start_pmac_0) + nr * 8;
330 unsigned long a; 330 unsigned long a;
331 int i;
331 332
332 /* may need to flush here if secondary bats aren't setup */ 333 /* may need to flush here if secondary bats aren't setup */
333 for (a = KERNELBASE; a < KERNELBASE + 0x800000; a += 32) 334 for (a = KERNELBASE; a < KERNELBASE + 0x800000; a += 32)
@@ -340,7 +341,11 @@ static void __init smp_psurge_kick_cpu(int nr)
340 mb(); 341 mb();
341 342
342 psurge_set_ipi(nr); 343 psurge_set_ipi(nr);
343 udelay(10); 344 /*
345 * We can't use udelay here because the timebase is now frozen.
346 */
347 for (i = 0; i < 2000; ++i)
348 barrier();
344 psurge_clr_ipi(nr); 349 psurge_clr_ipi(nr);
345 350
346 if (ppc_md.progress) ppc_md.progress("smp_psurge_kick_cpu - done", 0x354); 351 if (ppc_md.progress) ppc_md.progress("smp_psurge_kick_cpu - done", 0x354);