|
@@ -328,6 +328,7 @@ static void __init smp_psurge_kick_cpu(int nr)
|
|
{
|
|
{
|
|
unsigned long start = __pa(__secondary_start_pmac_0) + nr * 8;
|
|
unsigned long start = __pa(__secondary_start_pmac_0) + nr * 8;
|
|
unsigned long a;
|
|
unsigned long a;
|
|
|
|
+ int i;
|
|
|
|
|
|
/* may need to flush here if secondary bats aren't setup */
|
|
/* may need to flush here if secondary bats aren't setup */
|
|
for (a = KERNELBASE; a < KERNELBASE + 0x800000; a += 32)
|
|
for (a = KERNELBASE; a < KERNELBASE + 0x800000; a += 32)
|
|
@@ -340,7 +341,11 @@ static void __init smp_psurge_kick_cpu(int nr)
|
|
mb();
|
|
mb();
|
|
|
|
|
|
psurge_set_ipi(nr);
|
|
psurge_set_ipi(nr);
|
|
- udelay(10);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We can't use udelay here because the timebase is now frozen.
|
|
|
|
+ */
|
|
|
|
+ for (i = 0; i < 2000; ++i)
|
|
|
|
+ barrier();
|
|
psurge_clr_ipi(nr);
|
|
psurge_clr_ipi(nr);
|
|
|
|
|
|
if (ppc_md.progress) ppc_md.progress("smp_psurge_kick_cpu - done", 0x354);
|
|
if (ppc_md.progress) ppc_md.progress("smp_psurge_kick_cpu - done", 0x354);
|