powerpc: partly merge iseries do_IRQ
authorStephen Rothwell <sfr@canb.auug.org.au>
Wed, 16 Nov 2005 07:53:29 +0000 (18:53 +1100)
committerPaul Mackerras <paulus@samba.org>
Mon, 9 Jan 2006 03:50:11 +0000 (14:50 +1100)
Hide some of the iseries details in iSeries_get_irq.

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
arch/powerpc/kernel/irq.c
arch/powerpc/platforms/iseries/irq.c
arch/powerpc/platforms/iseries/irq.h
arch/powerpc/platforms/iseries/setup.c

index 5a71ed9..9540c45 100644 (file)
@@ -78,10 +78,6 @@ EXPORT_SYMBOL(__irq_offset_value);
 
 static int ppc_spurious_interrupts;
 
-#if defined(CONFIG_PPC_ISERIES) && defined(CONFIG_SMP)
-extern void iSeries_smp_message_recv(struct pt_regs *);
-#endif
-
 #ifdef CONFIG_PPC32
 #define NR_MASK_WORDS  ((NR_IRQS + 31) / 32)
 
@@ -195,49 +191,6 @@ void fixup_irqs(cpumask_t map)
 }
 #endif
 
-#ifdef CONFIG_PPC_ISERIES
-void do_IRQ(struct pt_regs *regs)
-{
-       struct paca_struct *lpaca;
-
-       irq_enter();
-
-#ifdef CONFIG_DEBUG_STACKOVERFLOW
-       /* Debugging check for stack overflow: is there less than 2KB free? */
-       {
-               long sp;
-
-               sp = __get_SP() & (THREAD_SIZE-1);
-
-               if (unlikely(sp < (sizeof(struct thread_info) + 2048))) {
-                       printk("do_IRQ: stack overflow: %ld\n",
-                               sp - sizeof(struct thread_info));
-                       dump_stack();
-               }
-       }
-#endif
-
-       lpaca = get_paca();
-#ifdef CONFIG_SMP
-       if (lpaca->lppaca.int_dword.fields.ipi_cnt) {
-               lpaca->lppaca.int_dword.fields.ipi_cnt = 0;
-               iSeries_smp_message_recv(regs);
-       }
-#endif /* CONFIG_SMP */
-       if (hvlpevent_is_pending())
-               process_hvlpevents(regs);
-
-       irq_exit();
-
-       if (lpaca->lppaca.int_dword.fields.decr_int) {
-               lpaca->lppaca.int_dword.fields.decr_int = 0;
-               /* Signal a fake decrementer interrupt */
-               timer_interrupt(regs);
-       }
-}
-
-#else  /* CONFIG_PPC_ISERIES */
-
 void do_IRQ(struct pt_regs *regs)
 {
        int irq;
@@ -286,16 +239,24 @@ void do_IRQ(struct pt_regs *regs)
                } else
 #endif
                        __do_IRQ(irq, regs);
-       } else
-#ifdef CONFIG_PPC32
-               if (irq != -2)
-#endif
-                       /* That's not SMP safe ... but who cares ? */
-                       ppc_spurious_interrupts++;
+       } else if (irq != -2)
+               /* That's not SMP safe ... but who cares ? */
+               ppc_spurious_interrupts++;
+
         irq_exit();
-}
 
-#endif /* CONFIG_PPC_ISERIES */
+#ifdef CONFIG_PPC_ISERIES
+       {
+               struct paca_struct *lpaca = get_paca();
+
+               if (lpaca->lppaca.int_dword.fields.decr_int) {
+                       lpaca->lppaca.int_dword.fields.decr_int = 0;
+                       /* Signal a fake decrementer interrupt */
+                       timer_interrupt(regs);
+               }
+       }
+#endif
+}
 
 void __init init_IRQ(void)
 {
index 3bd576e..5e92149 100644 (file)
 #include <linux/irq.h>
 #include <linux/spinlock.h>
 
+#include <asm/paca.h>
 #include <asm/iseries/hv_types.h>
 #include <asm/iseries/hv_lp_event.h>
 #include <asm/iseries/hv_call_xm.h>
+#include <asm/iseries/it_lp_queue.h>
 
 #include "irq.h"
 #include "call_pci.h"
 
+#if defined(CONFIG_SMP)
+extern void iSeries_smp_message_recv(struct pt_regs *);
+#endif
+
 enum pci_event_type {
        pe_bus_created          = 0,    /* PHB has been created */
        pe_bus_error            = 1,    /* PHB has failed */
@@ -329,3 +335,24 @@ int __init iSeries_allocate_IRQ(HvBusNumber bus,
        irq_desc[virtirq].handler = &iSeries_IRQ_handler;
        return virtirq;
 }
+
+/*
+ * Get the next pending IRQ.
+ */
+int iSeries_get_irq(struct pt_regs *regs)
+{
+       struct paca_struct *lpaca;
+
+       lpaca = get_paca();
+#ifdef CONFIG_SMP
+       if (lpaca->lppaca.int_dword.fields.ipi_cnt) {
+               lpaca->lppaca.int_dword.fields.ipi_cnt = 0;
+               iSeries_smp_message_recv(regs);
+       }
+#endif /* CONFIG_SMP */
+       if (hvlpevent_is_pending())
+               process_hvlpevents(regs);
+
+       /* -2 means ignore this interrupt */
+       return -2;
+}
index 5f643f1..b9c801b 100644 (file)
@@ -4,5 +4,6 @@
 extern void iSeries_init_IRQ(void);
 extern int  iSeries_allocate_IRQ(HvBusNumber, HvSubBusNumber, HvAgentId);
 extern void iSeries_activate_IRQs(void);
+extern int iSeries_get_irq(struct pt_regs *);
 
 #endif /* _ISERIES_IRQ_H */
index da26639..ad5ef80 100644 (file)
@@ -571,16 +571,6 @@ static void iSeries_show_cpuinfo(struct seq_file *m)
 
 /*
  * Document me.
- * and Implement me.
- */
-static int iSeries_get_irq(struct pt_regs *regs)
-{
-       /* -2 means ignore this interrupt */
-       return -2;
-}
-
-/*
- * Document me.
  */
 static void iSeries_restart(char *cmd)
 {