]> git.karo-electronics.de Git - linux-beck.git/blobdiff - arch/powerpc/platforms/pseries/xics.c
[PATCH] powerpc/pseries: Change H_StudlyCaps to H_SHOUTING_CAPS
[linux-beck.git] / arch / powerpc / platforms / pseries / xics.c
index 72ac18067ecef58c4af36c49502e387be119d3fd..2d60ea30fed6a00d24efa99085070fbfe2492c16 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/gfp.h>
 #include <linux/radix-tree.h>
 #include <linux/cpu.h>
+#include <asm/firmware.h>
 #include <asm/prom.h>
 #include <asm/io.h>
 #include <asm/pgtable.h>
@@ -48,11 +49,6 @@ static struct hw_interrupt_type xics_pic = {
        .set_affinity = xics_set_affinity
 };
 
-static struct hw_interrupt_type xics_8259_pic = {
-       .typename = " XICS/8259",
-       .ack = xics_mask_and_ack_irq,
-};
-
 /* This is used to map real irq numbers to virtual */
 static struct radix_tree_root irq_map = RADIX_TREE_INIT(GFP_ATOMIC);
 
@@ -172,7 +168,7 @@ static int pSeriesLP_xirr_info_get(int n_cpu)
        unsigned long return_value;
 
        lpar_rc = plpar_xirr(&return_value);
-       if (lpar_rc != H_Success)
+       if (lpar_rc != H_SUCCESS)
                panic(" bad return code xirr - rc = %lx \n", lpar_rc);
        return (int)return_value;
 }
@@ -183,7 +179,7 @@ static void pSeriesLP_xirr_info_set(int n_cpu, int value)
        unsigned long val64 = value & 0xffffffff;
 
        lpar_rc = plpar_eoi(val64);
-       if (lpar_rc != H_Success)
+       if (lpar_rc != H_SUCCESS)
                panic("bad return code EOI - rc = %ld, value=%lx\n", lpar_rc,
                      val64);
 }
@@ -193,7 +189,7 @@ void pSeriesLP_cppr_info(int n_cpu, u8 value)
        unsigned long lpar_rc;
 
        lpar_rc = plpar_cppr(value);
-       if (lpar_rc != H_Success)
+       if (lpar_rc != H_SUCCESS)
                panic("bad return code cppr - rc = %lx\n", lpar_rc);
 }
 
@@ -202,7 +198,7 @@ static void pSeriesLP_qirr_info(int n_cpu , u8 value)
        unsigned long lpar_rc;
 
        lpar_rc = plpar_ipi(get_hard_smp_processor_id(n_cpu), value);
-       if (lpar_rc != H_Success)
+       if (lpar_rc != H_SUCCESS)
                panic("bad return code qirr - rc = %lx\n", lpar_rc);
 }
 
@@ -367,12 +363,7 @@ int xics_get_irq(struct pt_regs *regs)
        /* for sanity, this had better be < NR_IRQS - 16 */
        if (vec == xics_irq_8259_cascade_real) {
                irq = i8259_irq(regs);
-               if (irq == -1) {
-                       /* Spurious cascaded interrupt.  Still must ack xics */
-                       xics_end_irq(irq_offset_up(xics_irq_8259_cascade));
-
-                       irq = -1;
-               }
+               xics_end_irq(irq_offset_up(xics_irq_8259_cascade));
        } else if (vec == XICS_IRQ_SPURIOUS) {
                irq = -1;
        } else {
@@ -391,7 +382,7 @@ int xics_get_irq(struct pt_regs *regs)
 
 #ifdef CONFIG_SMP
 
-irqreturn_t xics_ipi_action(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t xics_ipi_action(int irq, void *dev_id, struct pt_regs *regs)
 {
        int cpu = smp_processor_id();
 
@@ -417,7 +408,7 @@ irqreturn_t xics_ipi_action(int irq, void *dev_id, struct pt_regs *regs)
                        smp_message_recv(PPC_MSG_MIGRATE_TASK, regs);
                }
 #endif
-#ifdef CONFIG_DEBUGGER
+#if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC)
                if (test_and_clear_bit(PPC_MSG_DEBUGGER_BREAK,
                                       &xics_ipi_message[cpu].value)) {
                        mb();
@@ -509,7 +500,7 @@ nextnode:
             np;
             np = of_find_node_by_type(np, "cpu")) {
                ireg = (uint *)get_property(np, "reg", &ilen);
-               if (ireg && ireg[0] == boot_cpuid_phys) {
+               if (ireg && ireg[0] == get_hard_smp_processor_id(boot_cpuid)) {
                        ireg = (uint *)get_property(np, "ibm,ppc-interrupt-gserver#s",
                                                    &ilen);
                        i = ilen / sizeof(int);
@@ -542,14 +533,15 @@ nextnode:
                xics_irq_8259_cascade_real = *ireg;
                xics_irq_8259_cascade
                        = virt_irq_create_mapping(xics_irq_8259_cascade_real);
+               i8259_init(0, 0);
                of_node_put(np);
        }
 
-       if (platform_is_lpar())
+       if (firmware_has_feature(FW_FEATURE_LPAR))
                ops = &pSeriesLP_ops;
        else {
 #ifdef CONFIG_SMP
-               for_each_cpu(i) {
+               for_each_possible_cpu(i) {
                        int hard_id;
 
                        /* FIXME: Do this dynamically! --RR */
@@ -565,12 +557,7 @@ nextnode:
 #endif /* CONFIG_SMP */
        }
 
-       xics_8259_pic.enable = i8259_pic.enable;
-       xics_8259_pic.disable = i8259_pic.disable;
-       xics_8259_pic.end = i8259_pic.end;
-       for (i = 0; i < 16; ++i)
-               get_irq_desc(i)->handler = &xics_8259_pic;
-       for (; i < NR_IRQS; ++i)
+       for (i = irq_offset_value(); i < NR_IRQS; ++i)
                get_irq_desc(i)->handler = &xics_pic;
 
        xics_setup_cpu();
@@ -590,7 +577,6 @@ static int __init xics_setup_i8259(void)
                                no_action, 0, "8259 cascade", NULL))
                        printk(KERN_ERR "xics_setup_i8259: couldn't get 8259 "
                                        "cascade\n");
-               i8259_init(0, 0);
        }
        return 0;
 }