powerpc/xics: Fix numberspace mismatch from irq_desc conversion
[pandora-kernel.git] / arch / powerpc / platforms / pseries / xics.c
index 7b96e5a..9e7ff87 100644 (file)
@@ -202,20 +202,20 @@ static int get_irq_server(unsigned int virq, const struct cpumask *cpumask,
 #define get_irq_server(virq, cpumask, strict_check) (default_server)
 #endif
 
-static void xics_unmask_irq(unsigned int virq)
+static void xics_unmask_irq(struct irq_data *d)
 {
        unsigned int irq;
        int call_status;
        int server;
 
-       pr_devel("xics: unmask virq %d\n", virq);
+       pr_devel("xics: unmask virq %d\n", d->irq);
 
-       irq = (unsigned int)irq_map[virq].hwirq;
+       irq = (unsigned int)irq_map[d->irq].hwirq;
        pr_devel(" -> map to hwirq 0x%x\n", irq);
        if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS)
                return;
 
-       server = get_irq_server(virq, irq_to_desc(virq)->affinity, 0);
+       server = get_irq_server(d->irq, d->affinity, 0);
 
        call_status = rtas_call(ibm_set_xive, 3, 1, NULL, irq, server,
                                DEFAULT_PRIORITY);
@@ -235,52 +235,52 @@ static void xics_unmask_irq(unsigned int virq)
        }
 }
 
-static unsigned int xics_startup(unsigned int virq)
+static unsigned int xics_startup(struct irq_data *d)
 {
        /*
         * The generic MSI code returns with the interrupt disabled on the
         * card, using the MSI mask bits. Firmware doesn't appear to unmask
         * at that level, so we do it here by hand.
         */
-       if (irq_to_desc(virq)->msi_desc)
-               unmask_msi_irq(irq_get_irq_data(virq));
+       if (d->msi_desc)
+               unmask_msi_irq(d);
 
        /* unmask it */
-       xics_unmask_irq(virq);
+       xics_unmask_irq(d);
        return 0;
 }
 
-static void xics_mask_real_irq(unsigned int irq)
+static void xics_mask_real_irq(unsigned int hwirq)
 {
        int call_status;
 
-       if (irq == XICS_IPI)
+       if (hwirq == XICS_IPI)
                return;
 
-       call_status = rtas_call(ibm_int_off, 1, 1, NULL, irq);
+       call_status = rtas_call(ibm_int_off, 1, 1, NULL, hwirq);
        if (call_status != 0) {
                printk(KERN_ERR "%s: ibm_int_off irq=%u returned %d\n",
-                       __func__, irq, call_status);
+                       __func__, hwirq, call_status);
                return;
        }
 
        /* Have to set XIVE to 0xff to be able to remove a slot */
-       call_status = rtas_call(ibm_set_xive, 3, 1, NULL, irq,
+       call_status = rtas_call(ibm_set_xive, 3, 1, NULL, hwirq,
                                default_server, 0xff);
        if (call_status != 0) {
                printk(KERN_ERR "%s: ibm_set_xive(0xff) irq=%u returned %d\n",
-                       __func__, irq, call_status);
+                       __func__, hwirq, call_status);
                return;
        }
 }
 
-static void xics_mask_irq(unsigned int virq)
+static void xics_mask_irq(struct irq_data *d)
 {
        unsigned int irq;
 
-       pr_devel("xics: mask virq %d\n", virq);
+       pr_devel("xics: mask virq %d\n", d->irq);
 
-       irq = (unsigned int)irq_map[virq].hwirq;
+       irq = (unsigned int)irq_map[d->irq].hwirq;
        if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS)
                return;
        xics_mask_real_irq(irq);
@@ -371,30 +371,31 @@ static unsigned char pop_cppr(void)
        return os_cppr->stack[--os_cppr->index];
 }
 
-static void xics_eoi_direct(unsigned int virq)
+static void xics_eoi_direct(struct irq_data *d)
 {
-       unsigned int irq = (unsigned int)irq_map[virq].hwirq;
+       unsigned int irq = (unsigned int)irq_map[d->irq].hwirq;
 
        iosync();
        direct_xirr_info_set((pop_cppr() << 24) | irq);
 }
 
-static void xics_eoi_lpar(unsigned int virq)
+static void xics_eoi_lpar(struct irq_data *d)
 {
-       unsigned int irq = (unsigned int)irq_map[virq].hwirq;
+       unsigned int irq = (unsigned int)irq_map[d->irq].hwirq;
 
        iosync();
        lpar_xirr_info_set((pop_cppr() << 24) | irq);
 }
 
-static int xics_set_affinity(unsigned int virq, const struct cpumask *cpumask)
+static int
+xics_set_affinity(struct irq_data *d, const struct cpumask *cpumask, bool force)
 {
        unsigned int irq;
        int status;
        int xics_status[2];
        int irq_server;
 
-       irq = (unsigned int)irq_map[virq].hwirq;
+       irq = (unsigned int)irq_map[d->irq].hwirq;
        if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS)
                return -1;
 
@@ -406,13 +407,13 @@ static int xics_set_affinity(unsigned int virq, const struct cpumask *cpumask)
                return -1;
        }
 
-       irq_server = get_irq_server(virq, cpumask, 1);
+       irq_server = get_irq_server(d->irq, cpumask, 1);
        if (irq_server == -1) {
                char cpulist[128];
                cpumask_scnprintf(cpulist, sizeof(cpulist), cpumask);
                printk(KERN_WARNING
                        "%s: No online cpus in the mask %s for irq %d\n",
-                       __func__, cpulist, virq);
+                       __func__, cpulist, d->irq);
                return -1;
        }
 
@@ -430,20 +431,20 @@ static int xics_set_affinity(unsigned int virq, const struct cpumask *cpumask)
 
 static struct irq_chip xics_pic_direct = {
        .name = "XICS",
-       .startup = xics_startup,
-       .mask = xics_mask_irq,
-       .unmask = xics_unmask_irq,
-       .eoi = xics_eoi_direct,
-       .set_affinity = xics_set_affinity
+       .irq_startup = xics_startup,
+       .irq_mask = xics_mask_irq,
+       .irq_unmask = xics_unmask_irq,
+       .irq_eoi = xics_eoi_direct,
+       .irq_set_affinity = xics_set_affinity
 };
 
 static struct irq_chip xics_pic_lpar = {
        .name = "XICS",
-       .startup = xics_startup,
-       .mask = xics_mask_irq,
-       .unmask = xics_unmask_irq,
-       .eoi = xics_eoi_lpar,
-       .set_affinity = xics_set_affinity
+       .irq_startup = xics_startup,
+       .irq_mask = xics_mask_irq,
+       .irq_unmask = xics_unmask_irq,
+       .irq_eoi = xics_eoi_lpar,
+       .irq_set_affinity = xics_set_affinity
 };
 
 
@@ -469,8 +470,8 @@ static int xics_host_map(struct irq_host *h, unsigned int virq,
        /* Insert the interrupt mapping into the radix tree for fast lookup */
        irq_radix_revmap_insert(xics_host, virq, hw);
 
-       irq_to_desc(virq)->status |= IRQ_LEVEL;
-       set_irq_chip_and_handler(virq, xics_irq_chip, handle_fasteoi_irq);
+       irq_set_status_flags(virq, IRQ_LEVEL);
+       irq_set_chip_and_handler(virq, xics_irq_chip, handle_fasteoi_irq);
        return 0;
 }
 
@@ -599,7 +600,7 @@ static void xics_request_ipi(void)
         * IPIs are marked IRQF_DISABLED as they must run with irqs
         * disabled
         */
-       set_irq_handler(ipi, handle_percpu_irq);
+       irq_set_handler(ipi, handle_percpu_irq);
        if (firmware_has_feature(FW_FEATURE_LPAR))
                rc = request_irq(ipi, xics_ipi_action_lpar,
                                IRQF_DISABLED|IRQF_PERCPU, "IPI", NULL);
@@ -890,6 +891,7 @@ void xics_migrate_irqs_away(void)
 
        for_each_irq(virq) {
                struct irq_desc *desc;
+               struct irq_chip *chip;
                int xics_status[2];
                int status;
                unsigned long flags;
@@ -903,12 +905,15 @@ void xics_migrate_irqs_away(void)
                /* We need to get IPIs still. */
                if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS)
                        continue;
+
                desc = irq_to_desc(virq);
 
                /* We only need to migrate enabled IRQS */
-               if (desc == NULL || desc->chip == NULL
-                   || desc->action == NULL
-                   || desc->chip->set_affinity == NULL)
+               if (desc == NULL || desc->action == NULL)
+                       continue;
+
+               chip = irq_desc_get_chip(desc);
+               if (chip == NULL || chip->irq_set_affinity == NULL)
                        continue;
 
                raw_spin_lock_irqsave(&desc->lock, flags);
@@ -934,8 +939,8 @@ void xics_migrate_irqs_away(void)
                               virq, cpu);
 
                /* Reset affinity to all cpus */
-               cpumask_setall(irq_to_desc(virq)->affinity);
-               desc->chip->set_affinity(virq, cpu_all_mask);
+               cpumask_setall(desc->irq_data.affinity);
+               chip->irq_set_affinity(&desc->irq_data, cpu_all_mask, true);
 unlock:
                raw_spin_unlock_irqrestore(&desc->lock, flags);
        }