[PATCHv2 08/10] ARM: u300: convert to MULTI_IRQ_HANDLER
Jamie Iles
jamie at jamieiles.com
Wed Sep 28 08:03:40 EDT 2011
Hi Linus,
On Wed, Sep 28, 2011 at 01:03:34PM +0200, Linus Walleij wrote:
> Hold your horses:
>
> On Wed, Sep 28, 2011 at 12:41 PM, Jamie Iles <jamie at jamieiles.com> wrote:
>
> > diff --git a/arch/arm/mach-u300/include/mach/entry-macro.S b/arch/arm/mach-u300/include/mach/entry-macro.S
> > index 20731ae..7181d6a 100644
> > --- a/arch/arm/mach-u300/include/mach/entry-macro.S
> > +++ b/arch/arm/mach-u300/include/mach/entry-macro.S
> > @@ -8,33 +8,9 @@
> > * Low-level IRQ helper macros for ST-Ericsson U300
> > * Author: Linus Walleij <linus.walleij at stericsson.com>
> > */
> > -#include <mach/hardware.h>
> > -#include <asm/hardware/vic.h>
> >
> > .macro disable_fiq
> > .endm
> >
> > - .macro get_irqnr_preamble, base, tmp
> > - .endm
> > -
> > .macro arch_ret_to_user, tmp1, tmp2
> > .endm
> > -
> > - .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
> > - ldr \base, = U300_AHB_PER_VIRT_BASE-U300_AHB_PER_PHYS_BASE+U300_INTCON0_BASE
> > - ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get masked status
> > - mov \irqnr, #0
> > - teq \irqstat, #0
> > - bne 1002f
> > -1001: ldr \base, = U300_AHB_PER_VIRT_BASE-U300_AHB_PER_PHYS_BASE+U300_INTCON1_BASE
> > - ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get masked status
> > - mov \irqnr, #32
> > - teq \irqstat, #0
> > - beq 1003f
> > -1002: tst \irqstat, #1
> > - bne 1003f
> > - add \irqnr, \irqnr, #1
> > - movs \irqstat, \irqstat, lsr #1
> > - bne 1002b
> > -1003: /* EQ will be set if no irqs pending */
> > - .endm
>
> When I inspect patch 2 in this series I get the feeling that it assumes that
> there is one and only one VIC bank with 32 interrupts involved. This is
> not the case in the U300, it has 64 possible IRQ sources by OR:in the
> output IRQ signal from two VIC:s and feeding the resulting IRQ line
> into the CPU.
No, it will handle more than one vic, and it will check them in the
order the vic_init() is called. I've tested this on picoxcell that has
2 vic's in the same configuration as this.
> So in the code above we first check the 32 bits at the first VIC instance,
> and if that is zero we go on to check the other 32 bits.
>
> vic_single_handle_irq() needs to be modified to handle several
> ranges or atleast two.
The platform IRQ handler is actually vic_handle_irq() that internally
calls vic_single_handle_irq() for each registered vic (in the order of
registration).
> Note that in mach-u300/core.c we initialize each VIC like this:
> vic_init((void __iomem *) U300_INTCON0_VBASE, 0, mask[0], mask[0]);
> vic_init((void __iomem *) U300_INTCON1_VBASE, 32, mask[1], mask[1]);
>
> So I think the easiest may be to let vic_init() add registered VIC
> ranges to a list or array, and increas some num_vics variable
> to that vic_single_handle_irq() can traverse both ranges in
> order.
Jamie
More information about the linux-arm-kernel
mailing list