]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/platforms/pseries/xics.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[karo-tx-linux.git] / arch / powerpc / platforms / pseries / xics.c
index 0bb553331f4fcc8b495d718630f01d8df8e9238e..e1904774a70fecd21673f6e899d89251905f91d3 100644 (file)
@@ -201,17 +201,17 @@ static void xics_unmask_irq(unsigned int virq)
        call_status = rtas_call(ibm_set_xive, 3, 1, NULL, irq, server,
                                DEFAULT_PRIORITY);
        if (call_status != 0) {
-               printk(KERN_ERR "xics_enable_irq: irq=%u: ibm_set_xive "
-                      "returned %d\n", irq, call_status);
-               printk("set_xive %x, server %x\n", ibm_set_xive, server);
+               printk(KERN_ERR
+                       "%s: ibm_set_xive irq %u server %x returned %d\n",
+                       __func__, irq, server, call_status);
                return;
        }
 
        /* Now unmask the interrupt (often a no-op) */
        call_status = rtas_call(ibm_int_on, 1, 1, NULL, irq);
        if (call_status != 0) {
-               printk(KERN_ERR "xics_enable_irq: irq=%u: ibm_int_on "
-                      "returned %d\n", irq, call_status);
+               printk(KERN_ERR "%s: ibm_int_on irq=%u returned %d\n",
+                       __func__, irq, call_status);
                return;
        }
 }
@@ -232,8 +232,8 @@ static void xics_mask_real_irq(unsigned int irq)
 
        call_status = rtas_call(ibm_int_off, 1, 1, NULL, irq);
        if (call_status != 0) {
-               printk(KERN_ERR "xics_disable_real_irq: irq=%u: "
-                      "ibm_int_off returned %d\n", irq, call_status);
+               printk(KERN_ERR "%s: ibm_int_off irq=%u returned %d\n",
+                       __func__, irq, call_status);
                return;
        }
 
@@ -241,8 +241,8 @@ static void xics_mask_real_irq(unsigned int irq)
        call_status = rtas_call(ibm_set_xive, 3, 1, NULL, irq,
                                default_server, 0xff);
        if (call_status != 0) {
-               printk(KERN_ERR "xics_disable_irq: irq=%u: ibm_set_xive(0xff)"
-                      " returned %d\n", irq, call_status);
+               printk(KERN_ERR "%s: ibm_set_xive(0xff) irq=%u returned %d\n",
+                       __func__, irq, call_status);
                return;
        }
 }
@@ -346,8 +346,8 @@ static void xics_set_affinity(unsigned int virq, cpumask_t cpumask)
        status = rtas_call(ibm_get_xive, 1, 3, xics_status, irq);
 
        if (status) {
-               printk(KERN_ERR "xics_set_affinity: irq=%u ibm,get-xive "
-                      "returns %d\n", irq, status);
+               printk(KERN_ERR "%s: ibm,get-xive irq=%u returns %d\n",
+                       __func__, irq, status);
                return;
        }
 
@@ -359,8 +359,9 @@ static void xics_set_affinity(unsigned int virq, cpumask_t cpumask)
        if (irq_server == -1) {
                char cpulist[128];
                cpumask_scnprintf(cpulist, sizeof(cpulist), cpumask);
-               printk(KERN_WARNING "xics_set_affinity: No online cpus in "
-                               "the mask %s for irq %d\n", cpulist, virq);
+               printk(KERN_WARNING
+                       "%s: No online cpus in the mask %s for irq %d\n",
+                       __func__, cpulist, virq);
                return;
        }
 
@@ -368,8 +369,8 @@ static void xics_set_affinity(unsigned int virq, cpumask_t cpumask)
                                irq, irq_server, xics_status[1]);
 
        if (status) {
-               printk(KERN_ERR "xics_set_affinity: irq=%u ibm,set-xive "
-                      "returns %d\n", irq, status);
+               printk(KERN_ERR "%s: ibm,set-xive irq=%u returns %d\n",
+                       __func__, irq, status);
                return;
        }
 }
@@ -497,26 +498,23 @@ static irqreturn_t xics_ipi_dispatch(int cpu)
 {
        WARN_ON(cpu_is_offline(cpu));
 
+       mb();   /* order mmio clearing qirr */
        while (xics_ipi_message[cpu].value) {
                if (test_and_clear_bit(PPC_MSG_CALL_FUNCTION,
                                       &xics_ipi_message[cpu].value)) {
-                       mb();
                        smp_message_recv(PPC_MSG_CALL_FUNCTION);
                }
                if (test_and_clear_bit(PPC_MSG_RESCHEDULE,
                                       &xics_ipi_message[cpu].value)) {
-                       mb();
                        smp_message_recv(PPC_MSG_RESCHEDULE);
                }
                if (test_and_clear_bit(PPC_MSG_CALL_FUNC_SINGLE,
                                       &xics_ipi_message[cpu].value)) {
-                       mb();
                        smp_message_recv(PPC_MSG_CALL_FUNC_SINGLE);
                }
 #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC)
                if (test_and_clear_bit(PPC_MSG_DEBUGGER_BREAK,
                                       &xics_ipi_message[cpu].value)) {
-                       mb();
                        smp_message_recv(PPC_MSG_DEBUGGER_BREAK);
                }
 #endif
@@ -556,11 +554,11 @@ static void xics_request_ipi(void)
         */
        set_irq_handler(ipi, handle_percpu_irq);
        if (firmware_has_feature(FW_FEATURE_LPAR))
-               rc = request_irq(ipi, xics_ipi_action_lpar, IRQF_DISABLED,
-                               "IPI", NULL);
+               rc = request_irq(ipi, xics_ipi_action_lpar,
+                               IRQF_DISABLED|IRQF_PERCPU, "IPI", NULL);
        else
-               rc = request_irq(ipi, xics_ipi_action_direct, IRQF_DISABLED,
-                               "IPI", NULL);
+               rc = request_irq(ipi, xics_ipi_action_direct,
+                               IRQF_DISABLED|IRQF_PERCPU, "IPI", NULL);
        BUG_ON(rc);
 }
 
@@ -757,25 +755,21 @@ void xics_teardown_cpu(void)
 
 void xics_kexec_teardown_cpu(int secondary)
 {
-       unsigned int ipi;
-       struct irq_desc *desc;
-
        xics_teardown_cpu();
 
        /*
-        * we need to EOI the IPI
+        * we take the ipi irq but and never return so we
+        * need to EOI the IPI, but want to leave our priority 0
         *
-        * probably need to check all the other interrupts too
+        * should we check all the other interrupts too?
         * should we be flagging idle loop instead?
         * or creating some task to be scheduled?
         */
 
-       ipi = irq_find_mapping(xics_host, XICS_IPI);
-       if (ipi == XICS_IRQ_SPURIOUS)
-               return;
-       desc = get_irq_desc(ipi);
-       if (desc->chip && desc->chip->eoi)
-               desc->chip->eoi(ipi);
+       if (firmware_has_feature(FW_FEATURE_LPAR))
+               lpar_xirr_info_set((0x00 << 24) | XICS_IPI);
+       else
+               direct_xirr_info_set((0x00 << 24) | XICS_IPI);
 
        /*
         * Some machines need to have at least one cpu in the GIQ,
@@ -833,9 +827,8 @@ void xics_migrate_irqs_away(void)
 
                status = rtas_call(ibm_get_xive, 1, 3, xics_status, irq);
                if (status) {
-                       printk(KERN_ERR "migrate_irqs_away: irq=%u "
-                                       "ibm,get-xive returns %d\n",
-                                       virq, status);
+                       printk(KERN_ERR "%s: ibm,get-xive irq=%u returns %d\n",
+                                       __func__, irq, status);
                        goto unlock;
                }