[PATCHv2 02/10] ARM: vic: MULTI_IRQ_HANDLER handler

Jamie Iles jamie at jamieiles.com
Wed Sep 28 08:08:32 EDT 2011


Hi Linus,

On Wed, Sep 28, 2011 at 01:09:48PM +0200, Linus Walleij wrote:
> On Wed, Sep 28, 2011 at 12:41 PM, Jamie Iles <jamie at jamieiles.com> wrote:
> 
> > +static void vic_single_handle_irq(struct vic_device *vic, struct pt_regs *regs)
> > +{
> > +       u32 stat, irq;
> > +       bool handled = false;
> > +
> > +       while (!handled) {
> > +               stat = readl_relaxed(vic->base + VIC_IRQ_STATUS);
> > +               if (!stat)
> > +                       break;
> > +
> > +               while (stat) {
> > +                       irq = fls(stat) - 1;
> 
> Isn't fls "find last set"?
> 
> That means IRQs with higher numbers will be handled first will it not?
> 
> For U300 IRQs with lower numbers will be handled first
> by iteratively testing bit 0 and shifting right:
> 
> -1002:  tst     \irqstat, #1
> -       bne     1003f
> -       add     \irqnr, \irqnr, #1
> -       movs    \irqstat, \irqstat, lsr #1
> -       bne     1002b
> 
> So I would use ffs() for this to work the same way as before in
> U300.
> 
> Since this can have some performance impact, if the platforms differ
> in whether they handle IRQs from low to high or from high to low
> might need to be a flag passed in to vic_init() or so...

I don't know how important the ordering is, but if it is important then 
we could have vic_handle_irq_msb_first() and vic_handle_irq_lsb_first() 
as the handlers so there isn't any additional indirection/selection in 
the interrupt hot-path.

Jamie



More information about the linux-arm-kernel mailing list