[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.