]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/ia64/kernel/msi_ia64.c
[IA64] Add support for vector domain
[linux-2.6-omap-h63xx.git] / arch / ia64 / kernel / msi_ia64.c
index 0d05450c91c458211b8f00b72f9e3e169460d601..1d22670cc88b20fcd572172a97c88443571748dc 100644 (file)
@@ -52,6 +52,11 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, cpumask_t cpu_mask)
        struct msi_msg msg;
        u32 addr;
 
+       /* IRQ migration across domain is not supported yet */
+       cpus_and(cpu_mask, cpu_mask, irq_to_domain(irq));
+       if (cpus_empty(cpu_mask))
+               return;
+
        read_msi_msg(irq, &msg);
 
        addr = msg.address_lo;
@@ -60,7 +65,7 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, cpumask_t cpu_mask)
        msg.address_lo = addr;
 
        write_msi_msg(irq, &msg);
-       set_native_irq_info(irq, cpu_mask);
+       irq_desc[irq].affinity = cpu_mask;
 }
 #endif /* CONFIG_SMP */
 
@@ -68,15 +73,17 @@ int ia64_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
 {
        struct msi_msg  msg;
        unsigned long   dest_phys_id;
-       unsigned int    irq, vector;
+       int     irq, vector;
+       cpumask_t mask;
 
        irq = create_irq();
        if (irq < 0)
                return irq;
 
        set_irq_msi(irq, desc);
-       dest_phys_id = cpu_physical_id(first_cpu(cpu_online_map));
-       vector = irq;
+       cpus_and(mask, irq_to_domain(irq), cpu_online_map);
+       dest_phys_id = cpu_physical_id(first_cpu(mask));
+       vector = irq_to_vector(irq);
 
        msg.address_hi = 0;
        msg.address_lo =
@@ -110,7 +117,7 @@ static void ia64_ack_msi_irq(unsigned int irq)
 
 static int ia64_msi_retrigger_irq(unsigned int irq)
 {
-       unsigned int vector = irq;
+       unsigned int vector = irq_to_vector(irq);
        ia64_resend_irq(vector);
 
        return 1;