lkml.org 
[lkml]   [2008]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [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


    \
     
     \ /
      Last update: 2008-09-09 22:17    [W:0.029 / U:92.932 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site