]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
x86: add irq_cfg for 32bit
authorYinghai Lu <yhlu.kernel@gmail.com>
Wed, 20 Aug 2008 03:50:24 +0000 (20:50 -0700)
committerIngo Molnar <mingo@elte.hu>
Thu, 16 Oct 2008 14:52:52 +0000 (16:52 +0200)
it only contains vector ...

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/io_apic_32.c

index 668edf22606722c1e8469b77ca6fee0661fd0865..033ad953bee33a60d37f8971d064b76f5b03cd37 100644 (file)
@@ -94,6 +94,43 @@ DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
 
 static int disable_timer_pin_1 __initdata;
 
+struct irq_cfg {
+       u8 vector;
+};
+
+
+/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
+static struct irq_cfg irq_cfg_legacy[] __initdata = {
+       [0] = { .vector = FIRST_DEVICE_VECTOR,  },
+};
+
+static void __init init_work(void *data)
+{
+        struct dyn_array *da = data;
+        struct irq_cfg *cfg;
+        int legacy_count;
+        int i;
+
+        cfg = *da->name;
+
+        legacy_count = sizeof(irq_cfg_legacy)/sizeof(irq_cfg_legacy[0]);
+
+       BUG_ON(legacy_count > nr_irqs);
+
+        memcpy(cfg, irq_cfg_legacy, sizeof(irq_cfg_legacy));
+}
+
+static struct irq_cfg *irq_cfgx;
+DEFINE_DYN_ARRAY(irq_cfgx, sizeof(struct irq_cfg), nr_irqs, PAGE_SIZE, init_work);
+
+static struct irq_cfg *irq_cfg(unsigned int irq)
+{
+       if (irq >= nr_irqs)
+               return NULL;
+
+       return &irq_cfgx[irq];
+}
+
 /*
  * Rough estimation of how many shared IRQs there are, can
  * be changed anytime.
@@ -794,22 +831,6 @@ static inline int IO_APIC_irq_trigger(int irq)
        return 0;
 }
 
-/* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
-static u8 irq_vector_init_first __initdata = FIRST_DEVICE_VECTOR;
-static u8 *irq_vector;
-
-static void __init irq_vector_init_work(void *data)
-{
-       struct dyn_array *da = data;
-
-       u8 *irq_vec;
-
-       irq_vec = *da->name;
-
-       irq_vec[0] = irq_vector_init_first;
-}
-
-DEFINE_DYN_ARRAY(irq_vector, sizeof(u8), nr_irqs, PAGE_SIZE, irq_vector_init_work);
 
 static int __assign_irq_vector(int irq)
 {
@@ -818,8 +839,8 @@ static int __assign_irq_vector(int irq)
 
        BUG_ON((unsigned)irq >= nr_irqs);
 
-       if (irq_vector[irq] > 0)
-               return irq_vector[irq];
+       if (irq_cfg(irq)->vector > 0)
+               return irq_cfg(irq)->vector;
 
        vector = current_vector;
        offset = current_offset;
@@ -836,7 +857,7 @@ next:
 
        current_vector = vector;
        current_offset = offset;
-       irq_vector[irq] = vector;
+       irq_cfg(irq)->vector = vector;
 
        return vector;
 }
@@ -1598,7 +1619,7 @@ static void ack_ioapic_quirk_irq(unsigned int irq)
  * operation to prevent an edge-triggered interrupt escaping meanwhile.
  * The idea is from Manfred Spraul.  --macro
  */
-       i = irq_vector[irq];
+       i = irq_cfg(irq)->vector;
 
        v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
 
@@ -1615,7 +1636,7 @@ static void ack_ioapic_quirk_irq(unsigned int irq)
 
 static int ioapic_retrigger_irq(unsigned int irq)
 {
-       send_IPI_self(irq_vector[irq]);
+       send_IPI_self(irq_cfg(irq)->vector);
 
        return 1;
 }
@@ -1651,7 +1672,7 @@ static inline void init_IO_APIC_traps(void)
         * 0x80, because int 0x80 is hm, kind of importantish. ;)
         */
        for (irq = 0; irq < nr_irqs ; irq++) {
-               if (IO_APIC_IRQ(irq) && !irq_vector[irq]) {
+               if (IO_APIC_IRQ(irq) && !irq_cfg(irq)->vector) {
                        /*
                         * Hmm.. We don't have an entry for this,
                         * so default to an old-fashioned 8259
@@ -2102,7 +2123,7 @@ int create_irq(void)
        for (new = (nr_irqs - 1); new >= 0; new--) {
                if (platform_legacy_irq(new))
                        continue;
-               if (irq_vector[new] != 0)
+               if (irq_cfg(new)->vector != 0)
                        continue;
                vector = __assign_irq_vector(new);
                if (likely(vector > 0))
@@ -2125,8 +2146,8 @@ void destroy_irq(unsigned int irq)
        dynamic_irq_cleanup(irq);
 
        spin_lock_irqsave(&vector_lock, flags);
-       clear_bit(irq_vector[irq], used_vectors);
-       irq_vector[irq] = 0;
+       clear_bit(irq_cfg(irq)->vector, used_vectors);
+       irq_cfg(irq)->vector = 0;
        spin_unlock_irqrestore(&vector_lock, flags);
 }