]> 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 822e59a1b822fdfe4523628508936d844bd07002..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,18 +65,25 @@ 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 */
 
-int ia64_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
+int ia64_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
 {
        struct msi_msg  msg;
        unsigned long   dest_phys_id;
-       unsigned int    vector;
+       int     irq, vector;
+       cpumask_t mask;
+
+       irq = create_irq();
+       if (irq < 0)
+               return irq;
 
-       dest_phys_id = cpu_physical_id(first_cpu(cpu_online_map));
-       vector = irq;
+       set_irq_msi(irq, desc);
+       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 =
@@ -89,12 +101,12 @@ int ia64_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
        write_msi_msg(irq, &msg);
        set_irq_chip_and_handler(irq, &ia64_msi_chip, handle_edge_irq);
 
-       return 0;
+       return irq;
 }
 
 void ia64_teardown_msi_irq(unsigned int irq)
 {
-       return;         /* no-op */
+       destroy_irq(irq);
 }
 
 static void ia64_ack_msi_irq(unsigned int irq)
@@ -105,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;
@@ -126,12 +138,12 @@ static struct irq_chip ia64_msi_chip = {
 };
 
 
-int arch_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
+int arch_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
 {
        if (platform_setup_msi_irq)
-               return platform_setup_msi_irq(irq, pdev);
+               return platform_setup_msi_irq(pdev, desc);
 
-       return ia64_setup_msi_irq(irq, pdev);
+       return ia64_setup_msi_irq(pdev, desc);
 }
 
 void arch_teardown_msi_irq(unsigned int irq)