diff options
Diffstat (limited to 'arch/powerpc/platforms/pseries/xics.c')
-rw-r--r-- | arch/powerpc/platforms/pseries/xics.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index 2d60ea30fed6..b14f9b5c114e 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
@@ -522,7 +522,7 @@ nextnode: | |||
522 | 522 | ||
523 | np = of_find_node_by_type(NULL, "interrupt-controller"); | 523 | np = of_find_node_by_type(NULL, "interrupt-controller"); |
524 | if (!np) { | 524 | if (!np) { |
525 | printk(KERN_WARNING "xics: no ISA interrupt controller\n"); | 525 | printk(KERN_DEBUG "xics: no ISA interrupt controller\n"); |
526 | xics_irq_8259_cascade_real = -1; | 526 | xics_irq_8259_cascade_real = -1; |
527 | xics_irq_8259_cascade = -1; | 527 | xics_irq_8259_cascade = -1; |
528 | } else { | 528 | } else { |
@@ -641,23 +641,26 @@ void xics_teardown_cpu(int secondary) | |||
641 | ops->cppr_info(cpu, 0x00); | 641 | ops->cppr_info(cpu, 0x00); |
642 | iosync(); | 642 | iosync(); |
643 | 643 | ||
644 | /* Clear IPI */ | ||
645 | ops->qirr_info(cpu, 0xff); | ||
646 | |||
647 | /* | ||
648 | * we need to EOI the IPI if we got here from kexec down IPI | ||
649 | * | ||
650 | * probably need to check all the other interrupts too | ||
651 | * should we be flagging idle loop instead? | ||
652 | * or creating some task to be scheduled? | ||
653 | */ | ||
654 | ops->xirr_info_set(cpu, XICS_IPI); | ||
655 | |||
644 | /* | 656 | /* |
645 | * Some machines need to have at least one cpu in the GIQ, | 657 | * Some machines need to have at least one cpu in the GIQ, |
646 | * so leave the master cpu in the group. | 658 | * so leave the master cpu in the group. |
647 | */ | 659 | */ |
648 | if (secondary) { | 660 | if (secondary) |
649 | /* | ||
650 | * we need to EOI the IPI if we got here from kexec down IPI | ||
651 | * | ||
652 | * probably need to check all the other interrupts too | ||
653 | * should we be flagging idle loop instead? | ||
654 | * or creating some task to be scheduled? | ||
655 | */ | ||
656 | ops->xirr_info_set(cpu, XICS_IPI); | ||
657 | rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE, | 661 | rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE, |
658 | (1UL << interrupt_server_size) - 1 - | 662 | (1UL << interrupt_server_size) - 1 - |
659 | default_distrib_server, 0); | 663 | default_distrib_server, 0); |
660 | } | ||
661 | } | 664 | } |
662 | 665 | ||
663 | #ifdef CONFIG_HOTPLUG_CPU | 666 | #ifdef CONFIG_HOTPLUG_CPU |