GIC irq_start detection breaks 3.2 boot on platforms without PPIs
Will Deacon
will.deacon at arm.com
Thu Nov 24 11:35:49 EST 2011
Hi Rob,
In commit 4294f8baa ("ARM: gic: add irq_domain support"), you define
irq_start as irq_start = (irq_start & ~31) + 16; (later this was predicated
on irq_start > 0).
For platforms without any PPIs (i.e. irq_start is passed as a multiple of
32) then this leads to IRQs being off by 16. Something like this fixes it:
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c
index 0e6ae47..0c2d077 100644
--- a/arch/arm/common/gic.c
+++ b/arch/arm/common/gic.c
@@ -581,13 +581,16 @@ void __init gic_init(unsigned int gic_nr, int irq_start,
* For primary GICs, skip over SGIs.
* For secondary GICs, skip over PPIs, too.
*/
+ domain->hwirq_base = 32;
if (gic_nr == 0) {
gic_cpu_base_addr = cpu_base;
- domain->hwirq_base = 16;
- if (irq_start > 0)
- irq_start = (irq_start & ~31) + 16;
- } else
- domain->hwirq_base = 32;
+
+ if ((irq_start & 31) > 0) {
+ domain->hwirq_base = 16;
+ if (irq_start != -1)
+ irq_start = (irq_start & ~31) + 16;
+ }
+ }
/*
* Find out how many interrupts are supported.
which I can't say I'm especially pleased with but this code is really hard to
get right!
Will
More information about the linux-arm-kernel
mailing list