Subject: [PATCH] powerpc: EOI and clear IPI fix in xics_teardown_cpu()

From: Haren Myneni <[email-masked]>
Date: Sat, 08 Jul 2006 18:28:48 -0700

If OK, please sent this patch to upstream.

Thanks
Haren

When invoked kdump boot, plpar_eoi() call is getting failed and calling 
panic().
Kernel panic - not syncing: bad return code EOI - rc = -4, value=ff000000

The issue is with the desc->chip->eoi(XICS_IPI) in xics_teardown_cpu(). 
Instead of passing the virq to desc->chip->eoi(), XICS_IPI is used. 
Also, clear IPI in xics_teardown_cpu() got removed recently (in 
2.6.17-git25).  Noticed in some crash dump cases (Ex: initiate kdump 
boot using soft-reset and xmon is enabled), IPI is not cleared for some 
CPU(s) before starting the kdump boot. Hence, causing the kdump boot 
failure.

Signed-off-by: Haren Myneni <[email-masked]>

--- 2618-rc1/arch/powerpc/platforms/pseries/xics.c.orig	2006-07-08 11:47:58.000000000 -0700
+++ 2618-rc1/arch/powerpc/platforms/pseries/xics.c	2006-07-08 11:47:07.000000000 -0700
@@ -783,6 +783,14 @@ void xics_teardown_cpu(int secondary)
 	xics_set_cpu_priority(cpu, 0);
 
 	/*
+	 * Clear IPI
+	 */
+	if (firmware_has_feature(FW_FEATURE_LPAR))
+		lpar_qirr_info(cpu, 0xff);
+	else
+		direct_qirr_info(cpu, 0xff);
+
+	/*
 	 * we need to EOI the IPI if we got here from kexec down IPI
 	 *
 	 * probably need to check all the other interrupts too
@@ -795,7 +803,7 @@ void xics_teardown_cpu(int secondary)
 		return;
 	desc = get_irq_desc(ipi);
 	if (desc->chip && desc->chip->eoi)
-		desc->chip->eoi(XICS_IPI);
+		desc->chip->eoi(ipi);
 
 	/*
 	 * Some machines need to have at least one cpu in the GIQ,