Re: [PATCH] x86: io-apic - get rid of __DO_ACTION macro

From: Yinghai Lu
Date: Tue Sep 09 2008 - 16:13:56 EST


On Tue, Sep 9, 2008 at 11:46 AM, Cyrill Gorcunov <gorcunov@xxxxxxxxx> 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@xxxxxxxxx>
> ---
>
> 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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/