lkml.org 
[lkml]   [2006]   [Mar]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 2/3] per-platform IA64_{FIRST,LAST}_DEVICE_VECTOR definitions
    Abstract IA64_FIRST_DEVICE_VECTOR/IA64_LAST_DEVICE_VECTOR since SN platforms
    use a subset of the IA64 range. Implement this by making the above macros
    global variables which the platform can override in it setup code.

    Also add a reserve_irq_vector() routine used by SN to mark a vector's as
    in-use when that weren't allocated through assign_irq_vector().

    Signed-off-by: Mark Maule <maule@sgi.com>

    Index: linux-2.6.16/arch/ia64/kernel/irq_ia64.c
    ===================================================================
    --- linux-2.6.16.orig/arch/ia64/kernel/irq_ia64.c 2006-03-20 15:06:59.260807181 -0600
    +++ linux-2.6.16/arch/ia64/kernel/irq_ia64.c 2006-03-20 22:06:24.719085314 -0600
    @@ -46,6 +46,10 @@

    #define IRQ_DEBUG 0

    +/* These can be overridden in platform_irq_init */
    +int ia64_first_device_vector = IA64_DEF_FIRST_DEVICE_VECTOR;
    +int ia64_last_device_vector = IA64_DEF_LAST_DEVICE_VECTOR;
    +
    /* default base addr of IPI table */
    void __iomem *ipi_base_addr = ((void __iomem *)
    (__IA64_UNCACHED_OFFSET | IA64_IPI_DEFAULT_BASE_ADDR));
    @@ -60,7 +64,7 @@
    };
    EXPORT_SYMBOL(isa_irq_to_vector_map);

    -static unsigned long ia64_vector_mask[BITS_TO_LONGS(IA64_NUM_DEVICE_VECTORS)];
    +static unsigned long ia64_vector_mask[BITS_TO_LONGS(IA64_MAX_DEVICE_VECTORS)];

    int
    assign_irq_vector (int irq)
    @@ -89,6 +93,19 @@
    printk(KERN_WARNING "%s: double free!\n", __FUNCTION__);
    }

    +int
    +reserve_irq_vector (int vector)
    +{
    + int pos;
    +
    + if (vector < IA64_FIRST_DEVICE_VECTOR ||
    + vector > IA64_LAST_DEVICE_VECTOR)
    + return -EINVAL;
    +
    + pos = vector - IA64_FIRST_DEVICE_VECTOR;
    + return test_and_set_bit(pos, ia64_vector_mask);
    +}
    +
    #ifdef CONFIG_SMP
    # define IS_RESCHEDULE(vec) (vec == IA64_IPI_RESCHEDULE)
    #else
    Index: linux-2.6.16/arch/ia64/sn/kernel/irq.c
    ===================================================================
    --- linux-2.6.16.orig/arch/ia64/sn/kernel/irq.c 2006-03-20 15:06:59.260807181 -0600
    +++ linux-2.6.16/arch/ia64/sn/kernel/irq.c 2006-03-21 07:17:34.074494614 -0600
    @@ -202,6 +202,9 @@
    int i;
    irq_desc_t *base_desc = irq_desc;

    + ia64_first_device_vector = IA64_SN2_FIRST_DEVICE_VECTOR;
    + ia64_last_device_vector = IA64_SN2_LAST_DEVICE_VECTOR;
    +
    for (i = 0; i < NR_IRQS; i++) {
    if (base_desc[i].handler == &no_irq_type) {
    base_desc[i].handler = &irq_type_sn;
    @@ -285,6 +288,7 @@
    /* link it into the sn_irq[irq] list */
    spin_lock(&sn_irq_info_lock);
    list_add_rcu(&sn_irq_info->list, sn_irq_lh[sn_irq_info->irq_irq]);
    + reserve_irq_vector(sn_irq_info->irq_irq);
    spin_unlock(&sn_irq_info_lock);

    register_intr_pda(sn_irq_info);
    @@ -310,8 +314,11 @@
    spin_lock(&sn_irq_info_lock);
    list_del_rcu(&sn_irq_info->list);
    spin_unlock(&sn_irq_info_lock);
    + if (list_empty(sn_irq_lh[sn_irq_info->irq_irq]))
    + free_irq_vector(sn_irq_info->irq_irq);
    call_rcu(&sn_irq_info->rcu, sn_irq_info_free);
    pci_dev_put(pci_dev);
    +
    }

    static inline void
    Index: linux-2.6.16/include/asm-ia64/hw_irq.h
    ===================================================================
    --- linux-2.6.16.orig/include/asm-ia64/hw_irq.h 2006-03-20 15:06:59.260807181 -0600
    +++ linux-2.6.16/include/asm-ia64/hw_irq.h 2006-03-20 22:06:25.161425498 -0600
    @@ -47,9 +47,19 @@
    #define IA64_CMC_VECTOR 0x1f /* corrected machine-check interrupt vector */
    /*
    * Vectors 0x20-0x2f are reserved for legacy ISA IRQs.
    + * Use vectors 0x30-0xe7 as the default device vector range for ia64.
    + * Platforms may choose to reduce this range in platform_irq_setup, but the
    + * platform range must fall within
    + * [IA64_DEF_FIRST_DEVICE_VECTOR..IA64_DEF_LAST_DEVICE_VECTOR]
    */
    -#define IA64_FIRST_DEVICE_VECTOR 0x30
    -#define IA64_LAST_DEVICE_VECTOR 0xe7
    +extern int ia64_first_device_vector;
    +extern int ia64_last_device_vector;
    +
    +#define IA64_DEF_FIRST_DEVICE_VECTOR 0x30
    +#define IA64_DEF_LAST_DEVICE_VECTOR 0xe7
    +#define IA64_FIRST_DEVICE_VECTOR ia64_first_device_vector
    +#define IA64_LAST_DEVICE_VECTOR ia64_last_device_vector
    +#define IA64_MAX_DEVICE_VECTORS (IA64_DEF_LAST_DEVICE_VECTOR - IA64_DEF_FIRST_DEVICE_VECTOR + 1)
    #define IA64_NUM_DEVICE_VECTORS (IA64_LAST_DEVICE_VECTOR - IA64_FIRST_DEVICE_VECTOR + 1)

    #define IA64_MCA_RENDEZ_VECTOR 0xe8 /* MCA rendez interrupt */
    @@ -83,6 +93,7 @@

    extern int assign_irq_vector (int irq); /* allocate a free vector */
    extern void free_irq_vector (int vector);
    +extern int reserve_irq_vector (int vector);
    extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect);
    extern void register_percpu_irq (ia64_vector vec, struct irqaction *action);

    Index: linux-2.6.16/drivers/pci/msi.c
    ===================================================================
    --- linux-2.6.16.orig/drivers/pci/msi.c 2006-03-20 22:01:01.802923681 -0600
    +++ linux-2.6.16/drivers/pci/msi.c 2006-03-20 22:06:25.218060665 -0600
    @@ -35,7 +35,7 @@

    #ifndef CONFIG_X86_IO_APIC
    int vector_irq[NR_VECTORS] = { [0 ... NR_VECTORS - 1] = -1};
    -u8 irq_vector[NR_IRQ_VECTORS] = { FIRST_DEVICE_VECTOR , 0 };
    +u8 irq_vector[NR_IRQ_VECTORS];
    #endif

    static struct msi_ops *msi_ops;
    @@ -379,6 +379,11 @@
    printk(KERN_WARNING "PCI: MSI cache init failed\n");
    return status;
    }
    +
    +#ifndef CONFIG_X86_IO_APIC
    + irq_vector[0] = FIRST_DEVICE_VECTOR;
    +#endif
    +
    last_alloc_vector = assign_irq_vector(AUTO_ASSIGN);
    if (last_alloc_vector < 0) {
    pci_msi_enable = 0;
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2006-03-21 15:38    [W:0.049 / U:94.140 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site