Messages in this thread | | | Date | Tue, 9 Sep 2008 13:13:45 -0700 | From | "Yinghai Lu" <> | Subject | Re: [PATCH] x86: io-apic - get rid of __DO_ACTION macro |
| |
On Tue, Sep 9, 2008 at 11:46 AM, Cyrill Gorcunov <gorcunov@gmail.com> wrote: > Replace __DO_ACTION macro with io_apic_modify_irq function. > This allow us to 'grep' definitions being hided by > the macro, ie the following: > > __unmask_IO_APIC_irq > __mask_IO_APIC_irq > __mask_and_edge_IO_APIC_irq > __unmask_and_level_IO_APIC_irq > > Also I removed R parameter which was to define offset inside > route table but always being zero for now and I don't think > if it ever will be other then that. > > Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com> > --- > > Please review. This modification doesn't map object file into the > same former state 'cause of 'for(entry)' cycle form changed and > new mask 'mask_and_not' added to be able to fill register with > pure zeros - ie clear register completely. > > Any comments are quite welcome! > > Index: linux-2.6.git/arch/x86/kernel/io_apic.c > =================================================================== > --- linux-2.6.git.orig/arch/x86/kernel/io_apic.c 2008-09-09 22:27:57.000000000 +0400 > +++ linux-2.6.git/arch/x86/kernel/io_apic.c 2008-09-09 22:34:03.000000000 +0400 > @@ -643,65 +643,66 @@ static void __init replace_pin_at_irq(un > add_pin_to_irq(irq, newapic, newpin); > } > > -#define __DO_ACTION(R, ACTION_ENABLE, ACTION_DISABLE, FINAL) \ > - \ > -{ \ > - int pin; \ > - struct irq_cfg *cfg; \ > - struct irq_pin_list *entry; \ > - \ > - cfg = irq_cfg(irq); \ > - entry = cfg->irq_2_pin; \ > - for (;;) { \ > - unsigned int reg; \ > - if (!entry) \ > - break; \ > - pin = entry->pin; \ > - reg = io_apic_read(entry->apic, 0x10 + R + pin*2); \ > - reg ACTION_DISABLE; \ > - reg ACTION_ENABLE; \ > - io_apic_modify(entry->apic, 0x10 + R + pin*2, reg); \ > - FINAL; \ > - if (!entry->next) \ > - break; \ > - entry = entry->next; \ > - } \ > -} > - > -#define DO_ACTION(name,R, ACTION_ENABLE, ACTION_DISABLE, FINAL) \ > - \ > - static void name##_IO_APIC_irq (unsigned int irq) \ > - __DO_ACTION(R, ACTION_ENABLE, ACTION_DISABLE, FINAL) > +static inline void io_apic_modify_irq(unsigned int irq, > + int mask_and, int mask_or, > + int mask_and_not, int read_after_mod) > +{ > + int pin; > + struct irq_cfg *cfg; > + struct irq_pin_list *entry; > > -/* mask = 0 */ > -DO_ACTION(__unmask, 0, |= 0, &= ~IO_APIC_REDIR_MASKED, ) > + cfg = irq_cfg(irq); > + for (entry = cfg->irq_2_pin; entry != NULL; entry = entry->next) { > + unsigned int reg; > + pin = entry->pin; > + reg = io_apic_read(entry->apic, 0x10 + pin * 2); > + if (mask_and) > + reg &= mask_and;
if mask_and == 0, you don't need to clear it ?
> + if (mask_or) > + reg |= mask_or; > + if (mask_and_not) > + reg &= !mask_and_not;
it seems you should use ~ instead of !
> + io_apic_modify(entry->apic, 0x10 + pin * 2, reg); > + if (read_after_mod) { > + /* > + * Synchronize the IO-APIC and the CPU by doing > + * a dummy read from the IO-APIC > + */ > + struct io_apic __iomem *io_apic; > + io_apic = io_apic_base(entry->apic); > + readl(&io_apic->data);
hope we can keep using MACRO..
YH
| |