diff options
author | Paul Mackerras <paulus@samba.org> | 2005-09-30 23:49:08 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2005-09-30 23:49:08 -0400 |
commit | c0c0d996d08e450164adedc249c1bbbca63524ce (patch) | |
tree | 15f297796a93568fd45756c72ca07e77756c8653 /arch/powerpc/platforms/powermac | |
parent | ab11d1ea281e85895369ef57c5259ad8a432fabb (diff) |
powerpc: Get merged kernel to compile and run on 32-bit SMP powermac.
This updates the powermac SMP code to use the mpic driver instead of
the openpic driver and fixes the SMP-dependent context switch code.
We had a subtle bug where we were using interrupt numbers 256-259 for
IPIs, but ppc32 had NR_IRQS = 256. Moved the IPIs down to use interrupt
numbers 252-255 instead.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/platforms/powermac')
-rw-r--r-- | arch/powerpc/platforms/powermac/pmac_pic.c | 7 | ||||
-rw-r--r-- | arch/powerpc/platforms/powermac/pmac_smp.c | 10 |
2 files changed, 9 insertions, 8 deletions
diff --git a/arch/powerpc/platforms/powermac/pmac_pic.c b/arch/powerpc/platforms/powermac/pmac_pic.c index a6b1b577e19f..7ddd5264cc6e 100644 --- a/arch/powerpc/platforms/powermac/pmac_pic.c +++ b/arch/powerpc/platforms/powermac/pmac_pic.c | |||
@@ -430,7 +430,7 @@ void __init pmac_pic_init(void) | |||
430 | prom_get_irq_senses(senses, 0, 128); | 430 | prom_get_irq_senses(senses, 0, 128); |
431 | mpic1 = mpic_alloc(irqctrler->addrs[0].address, | 431 | mpic1 = mpic_alloc(irqctrler->addrs[0].address, |
432 | MPIC_PRIMARY | MPIC_WANTS_RESET, | 432 | MPIC_PRIMARY | MPIC_WANTS_RESET, |
433 | 0, 0, 128, 256, senses, 128, " K2-MPIC "); | 433 | 0, 0, 128, 252, senses, 128, " OpenPIC "); |
434 | BUG_ON(mpic1 == NULL); | 434 | BUG_ON(mpic1 == NULL); |
435 | mpic_init(mpic1); | 435 | mpic_init(mpic1); |
436 | 436 | ||
@@ -441,14 +441,15 @@ void __init pmac_pic_init(void) | |||
441 | irqctrler2->intrs[0].line); | 441 | irqctrler2->intrs[0].line); |
442 | 442 | ||
443 | pmac_call_feature(PMAC_FTR_ENABLE_MPIC, irqctrler2, 0, 0); | 443 | pmac_call_feature(PMAC_FTR_ENABLE_MPIC, irqctrler2, 0, 0); |
444 | prom_get_irq_senses(senses, 128, 128 + 128); | 444 | prom_get_irq_senses(senses, 128, 128 + 124); |
445 | 445 | ||
446 | /* We don't need to set MPIC_BROKEN_U3 here since we don't have | 446 | /* We don't need to set MPIC_BROKEN_U3 here since we don't have |
447 | * hypertransport interrupts routed to it | 447 | * hypertransport interrupts routed to it |
448 | */ | 448 | */ |
449 | mpic2 = mpic_alloc(irqctrler2->addrs[0].address, | 449 | mpic2 = mpic_alloc(irqctrler2->addrs[0].address, |
450 | MPIC_BIG_ENDIAN | MPIC_WANTS_RESET, | 450 | MPIC_BIG_ENDIAN | MPIC_WANTS_RESET, |
451 | 0, 128, 128, 0, senses, 128, " U3-MPIC "); | 451 | 0, 128, 124, 0, senses, 124, |
452 | " U3-MPIC "); | ||
452 | BUG_ON(mpic2 == NULL); | 453 | BUG_ON(mpic2 == NULL); |
453 | mpic_init(mpic2); | 454 | mpic_init(mpic2); |
454 | mpic_setup_cascade(irqctrler2->intrs[0].line, | 455 | mpic_setup_cascade(irqctrler2->intrs[0].line, |
diff --git a/arch/powerpc/platforms/powermac/pmac_smp.c b/arch/powerpc/platforms/powermac/pmac_smp.c index 995e9095d865..fb996336c58b 100644 --- a/arch/powerpc/platforms/powermac/pmac_smp.c +++ b/arch/powerpc/platforms/powermac/pmac_smp.c | |||
@@ -48,7 +48,7 @@ | |||
48 | #include <asm/machdep.h> | 48 | #include <asm/machdep.h> |
49 | #include <asm/pmac_feature.h> | 49 | #include <asm/pmac_feature.h> |
50 | #include <asm/time.h> | 50 | #include <asm/time.h> |
51 | #include <asm/open_pic.h> | 51 | #include <asm/mpic.h> |
52 | #include <asm/cacheflush.h> | 52 | #include <asm/cacheflush.h> |
53 | #include <asm/keylargo.h> | 53 | #include <asm/keylargo.h> |
54 | 54 | ||
@@ -638,14 +638,14 @@ void smp_core99_message_pass(int target, int msg, unsigned long data, int wait) | |||
638 | } | 638 | } |
639 | switch (target) { | 639 | switch (target) { |
640 | case MSG_ALL: | 640 | case MSG_ALL: |
641 | mpic_send_ipi(msg, mask); | 641 | mpic_send_ipi(msg, cpus_addr(mask)[0]); |
642 | break; | 642 | break; |
643 | case MSG_ALL_BUT_SELF: | 643 | case MSG_ALL_BUT_SELF: |
644 | cpu_clear(smp_processor_id(), mask); | 644 | cpu_clear(smp_processor_id(), mask); |
645 | mpic_send_ipi(msg, mask); | 645 | mpic_send_ipi(msg, cpus_addr(mask)[0]); |
646 | break; | 646 | break; |
647 | default: | 647 | default: |
648 | mpic_send_ipi(msg, cpumask_of_cpu(target)); | 648 | mpic_send_ipi(msg, 1 << target); |
649 | break; | 649 | break; |
650 | } | 650 | } |
651 | } | 651 | } |
@@ -678,7 +678,7 @@ int __cpu_disable(void) | |||
678 | cpu_clear(smp_processor_id(), cpu_online_map); | 678 | cpu_clear(smp_processor_id(), cpu_online_map); |
679 | 679 | ||
680 | /* XXX reset cpu affinity here */ | 680 | /* XXX reset cpu affinity here */ |
681 | openpic_set_priority(0xf); | 681 | mpic_cpu_set_priority(0xf); |
682 | asm volatile("mtdec %0" : : "r" (0x7fffffff)); | 682 | asm volatile("mtdec %0" : : "r" (0x7fffffff)); |
683 | mb(); | 683 | mb(); |
684 | udelay(20); | 684 | udelay(20); |