[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen/arm: Missing +1 when then number of interrupt lines for the GIC is computed
On 04/25/2013 09:10 AM, Ian Campbell wrote: > On Wed, 2013-04-24 at 20:44 +0100, Julien Grall wrote: >> In the GIC manual, the number of interrupt lines is computed with the >> following >> formula: 32(N + 1) where N is the value retrieved from GICD_TYPER. > > My copy of the manual says "The ITLinesNumber field only indicates the > maximum number of SPIs that the GIC might support", which excludes SGIs > and PPIs. On the other hand it also says that 0b0011 == 128 interrupts, > with ID 0..127, and elsewhere it includes SPI and PPI in the term > interrupts. > > So it's not really clear, but I think your interpretation is likely > correct. Perhaps we need to add a comment to describe the "lines" field to avoid confusion later. > The impact of getting this count wrong is that currently we don't > initialise the final 32 interrupts worth of the GICD_FOOn registers, is > that right? Right. > I was concerned that we special case the first 32 SG/PPI interrupts in > various other places, but we don't appear to use gic.lines anywhere > other than that. > > BTW, I also happened across section 3.1.2 "Identifying the supported > interrupts" which recommends probing GICD_ISENABLERn to determine which > of the 32*(N+1) interrupts are actually available us, might be one for > the todo list (would lead to a useful debugging message "request_irq: > IRQ%d is not available"). > >> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> > > Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > >> --- >> xen/arch/arm/gic.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c >> index 760c86b..389c217 100644 >> --- a/xen/arch/arm/gic.c >> +++ b/xen/arch/arm/gic.c >> @@ -216,7 +216,7 @@ static int gic_route_irq(unsigned int irq, bool_t level, >> >> ASSERT(!(cpu_mask & ~0xff)); /* Targets bitmap only supports 8 CPUs */ >> ASSERT(priority <= 0xff); /* Only 8 bits of priority */ >> - ASSERT(irq < gic.lines + 32); /* Can't route interrupts that don't >> exist */ >> + ASSERT(irq < gic.lines); /* Can't route interrupts that don't >> exist */ >> >> spin_lock_irqsave(&desc->lock, flags); >> spin_lock(&gic.lock); >> @@ -264,7 +264,7 @@ static void __init gic_dist_init(void) >> GICD[GICD_CTLR] = 0; >> >> type = GICD[GICD_TYPER]; >> - gic.lines = 32 * (type & GICD_TYPE_LINES); >> + gic.lines = 32 * ((type & GICD_TYPE_LINES) + 1); >> gic.cpus = 1 + ((type & GICD_TYPE_CPUS) >> 5); >> printk("GIC: %d lines, %d cpu%s%s (IID %8.8x).\n", >> gic.lines, gic.cpus, (gic.cpus == 1) ? "" : "s", > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |