diff mbox

powerpc: XICS - fix getting the server number size

Message ID 20081022163632.2c67a53d@bull.net (mailing list archive)
State Accepted, archived
Commit 1ef8014debb6410ed1960c4477d0006df11157c1
Delegated to: Paul Mackerras
Headers show

Commit Message

Sebastien Dugue Oct. 22, 2008, 2:36 p.m. UTC
The 'ibm,interrupt-server#-size' properties are not cpu nodes properties,
but rather live under the interrupt source controller nodes (compatible
ibm,ppc-xics).

  Therefore, this patch moves the detection of this property outside of
xics_update_irq_servers() and into xics_init_IRQ().

  Also this adds a check for mismatched sizes across the interrupt source
controller nodes. Not sure this is necessary as in this case the firmware
might be seriously busted.

Signed-off-by: Sebastien Dugue <sebastien.dugue@bull.net>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Milton Miller <miltonm@bga.com>
---
 arch/powerpc/platforms/pseries/xics.c |   28 ++++++++++++++++++++++------
 1 files changed, 22 insertions(+), 6 deletions(-)

Comments

Milton Miller Oct. 22, 2008, 8:34 p.m. UTC | #1
On Oct 22, 2008, at 9:36 AM, Sebastien Dugue wrote:

>
>   The 'ibm,interrupt-server#-size' properties are not cpu nodes 
> properties,
> but rather live under the interrupt source controller nodes (compatible
> ibm,ppc-xics).
>
>   Therefore, this patch moves the detection of this property outside of
> xics_update_irq_servers() and into xics_init_IRQ().
>

yes, PAPR says its on one of the interrupt nodes.   I am too tired to
decipher if it on the presentation or source.


Acked-by: Milton Miller <miltonm@bga.com>

>   Also this adds a check for mismatched sizes across the interrupt 
> source
> controller nodes. Not sure this is necessary as in this case the 
> firmware
> might be seriously busted.

I am hoping you have tested this?  A POWER6 box?

Last time I looked (POWER5 timeframe) firmware was ignoring the 
parameter
to set-indicator(gqirm) which is the only use of this property.

milton
Sebastien Dugue Oct. 23, 2008, 6:22 a.m. UTC | #2
On Wed, 22 Oct 2008 15:34:52 -0500 Milton Miller <miltonm@bga.com> wrote:

> 
> On Oct 22, 2008, at 9:36 AM, Sebastien Dugue wrote:
> 
> >
> >   The 'ibm,interrupt-server#-size' properties are not cpu nodes 
> > properties,
> > but rather live under the interrupt source controller nodes (compatible
> > ibm,ppc-xics).
> >
> >   Therefore, this patch moves the detection of this property outside of
> > xics_update_irq_servers() and into xics_init_IRQ().
> >
> 
> yes, PAPR says its on one of the interrupt nodes.   I am too tired to
> decipher if it on the presentation or source.

  Interrupt source nodes. I tried to check the device tree on a POWER5
box, but all those we have here are running LPAR'ed AIX and I'm not sure
the DT dump tool is not lying to me and filtering the interesting stuff
(not interrupt nodes reported).

> 
> 
> Acked-by: Milton Miller <miltonm@bga.com>
> 
> >   Also this adds a check for mismatched sizes across the interrupt 
> > source
> > controller nodes. Not sure this is necessary as in this case the 
> > firmware
> > might be seriously busted.
> 
> I am hoping you have tested this?  A POWER6 box?

  Yep, on a POWER6 box doing cpu off/onlining. Unfortunately I don't have
a POWER5 box running Linux right now to test on.

> 
> Last time I looked (POWER5 timeframe) firmware was ignoring the 
> parameter
> to set-indicator(gqirm) which is the only use of this property.

  Right, the POWER6 also seems to ignore this, but it will avoid being
bitten the day this changes.

  Thanks,

  Sebastien.
diff mbox

Patch

diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c
index e190477..75a289b 100644
--- a/arch/powerpc/platforms/pseries/xics.c
+++ b/arch/powerpc/platforms/pseries/xics.c
@@ -579,7 +579,7 @@  static void xics_update_irq_servers(void)
 	int i, j;
 	struct device_node *np;
 	u32 ilen;
-	const u32 *ireg, *isize;
+	const u32 *ireg;
 	u32 hcpuid;
 
 	/* Find the server numbers for the boot cpu. */
@@ -607,11 +607,6 @@  static void xics_update_irq_servers(void)
 		}
 	}
 
-	/* get the bit size of server numbers */
-	isize = of_get_property(np, "ibm,interrupt-server#-size", NULL);
-	if (isize)
-		interrupt_server_size = *isize;
-
 	of_node_put(np);
 }
 
@@ -682,6 +677,7 @@  void __init xics_init_IRQ(void)
 	struct device_node *np;
 	u32 indx = 0;
 	int found = 0;
+	const u32 *isize;
 
 	ppc64_boot_msg(0x20, "XICS Init");
 
@@ -701,6 +697,26 @@  void __init xics_init_IRQ(void)
 	if (found == 0)
 		return;
 
+	/* get the bit size of server numbers */
+	found = 0;
+
+	for_each_compatible_node(np, NULL, "ibm,ppc-xics") {
+		isize = of_get_property(np, "ibm,interrupt-server#-size", NULL);
+
+		if (!isize)
+			continue;
+
+		if (!found) {
+			interrupt_server_size = *isize;
+			found = 1;
+		} else if (*isize != interrupt_server_size) {
+			printk(KERN_WARNING "XICS: "
+			       "mismatched ibm,interrupt-server#-size\n");
+			interrupt_server_size = max(*isize,
+						    interrupt_server_size);
+		}
+	}
+
 	xics_update_irq_servers();
 	xics_init_host();