mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 07:01:57 +00:00
Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: powerpc/85xx: Fix SMP when "cpu-release-addr" is in lowmem powerpc/85xx: Fix oops during MSI driver probe on MPC85xxMDS boards
This commit is contained in:
commit
ab320af224
@ -338,7 +338,8 @@ static void __init mpc85xx_mds_pic_init(void)
|
||||
}
|
||||
|
||||
mpic = mpic_alloc(np, r.start,
|
||||
MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
|
||||
MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN |
|
||||
MPIC_BROKEN_FRR_NIRQS,
|
||||
0, 256, " OpenPIC ");
|
||||
BUG_ON(mpic == NULL);
|
||||
of_node_put(np);
|
||||
|
@ -46,6 +46,7 @@ smp_85xx_kick_cpu(int nr)
|
||||
__iomem u32 *bptr_vaddr;
|
||||
struct device_node *np;
|
||||
int n = 0;
|
||||
int ioremappable;
|
||||
|
||||
WARN_ON (nr < 0 || nr >= NR_CPUS);
|
||||
|
||||
@ -59,21 +60,37 @@ smp_85xx_kick_cpu(int nr)
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* A secondary core could be in a spinloop in the bootpage
|
||||
* (0xfffff000), somewhere in highmem, or somewhere in lowmem.
|
||||
* The bootpage and highmem can be accessed via ioremap(), but
|
||||
* we need to directly access the spinloop if its in lowmem.
|
||||
*/
|
||||
ioremappable = *cpu_rel_addr > virt_to_phys(high_memory);
|
||||
|
||||
/* Map the spin table */
|
||||
bptr_vaddr = ioremap(*cpu_rel_addr, SIZE_BOOT_ENTRY);
|
||||
if (ioremappable)
|
||||
bptr_vaddr = ioremap(*cpu_rel_addr, SIZE_BOOT_ENTRY);
|
||||
else
|
||||
bptr_vaddr = phys_to_virt(*cpu_rel_addr);
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
out_be32(bptr_vaddr + BOOT_ENTRY_PIR, nr);
|
||||
out_be32(bptr_vaddr + BOOT_ENTRY_ADDR_LOWER, __pa(__early_start));
|
||||
|
||||
if (!ioremappable)
|
||||
flush_dcache_range((ulong)bptr_vaddr,
|
||||
(ulong)(bptr_vaddr + SIZE_BOOT_ENTRY));
|
||||
|
||||
/* Wait a bit for the CPU to ack. */
|
||||
while ((__secondary_hold_acknowledge != nr) && (++n < 1000))
|
||||
mdelay(1);
|
||||
|
||||
local_irq_restore(flags);
|
||||
|
||||
iounmap(bptr_vaddr);
|
||||
if (ioremappable)
|
||||
iounmap(bptr_vaddr);
|
||||
|
||||
pr_debug("waited %d msecs for CPU #%d.\n", n, nr);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user