aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/pseries
diff options
context:
space:
mode:
authorMilton Miller <miltonm@bga.com>2008-10-09 21:56:35 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2008-10-13 01:24:18 -0400
commit1a57c926b6da56b4f904a0d8117ac362724f8c66 (patch)
tree2143c7220c43b45de7401811edbe8c486956a276 /arch/powerpc/platforms/pseries
parentb4963255ad5a426f04a0bb15c4315fa4bb40cde9 (diff)
powerpc/xics: EOI xics ipi by hand in kexec
EOI normally has the side effect of returning the cpu to the base priority to recieve the next interrupt. This is actually controlled by the top byte of the xirr register. When we are exiting the kernel in kexec we must eoi the ipi for the next kernel because we never return from the handler, but we want to leave interrupt delivery blocked until the next kernel takes action. Since the hardware ipi vector is fixed, its easiest to just do the eoi explicitly. Signed-off-by: Milton Miller <miltonm@bga.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/platforms/pseries')
-rw-r--r--arch/powerpc/platforms/pseries/xics.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c
index 0bb553331f4..165234d2599 100644
--- a/arch/powerpc/platforms/pseries/xics.c
+++ b/arch/powerpc/platforms/pseries/xics.c
@@ -757,25 +757,21 @@ void xics_teardown_cpu(void)
757 757
758void xics_kexec_teardown_cpu(int secondary) 758void xics_kexec_teardown_cpu(int secondary)
759{ 759{
760 unsigned int ipi;
761 struct irq_desc *desc;
762
763 xics_teardown_cpu(); 760 xics_teardown_cpu();
764 761
765 /* 762 /*
766 * we need to EOI the IPI 763 * we take the ipi irq but and never return so we
764 * need to EOI the IPI, but want to leave our priority 0
767 * 765 *
768 * probably need to check all the other interrupts too 766 * should we check all the other interrupts too?
769 * should we be flagging idle loop instead? 767 * should we be flagging idle loop instead?
770 * or creating some task to be scheduled? 768 * or creating some task to be scheduled?
771 */ 769 */
772 770
773 ipi = irq_find_mapping(xics_host, XICS_IPI); 771 if (firmware_has_feature(FW_FEATURE_LPAR))
774 if (ipi == XICS_IRQ_SPURIOUS) 772 lpar_xirr_info_set((0x00 << 24) | XICS_IPI);
775 return; 773 else
776 desc = get_irq_desc(ipi); 774 direct_xirr_info_set((0x00 << 24) | XICS_IPI);
777 if (desc->chip && desc->chip->eoi)
778 desc->chip->eoi(ipi);
779 775
780 /* 776 /*
781 * Some machines need to have at least one cpu in the GIQ, 777 * Some machines need to have at least one cpu in the GIQ,