提交 e199500c 编写于 作者: S Stephen Rothwell 提交者: Paul Mackerras

powerpc: partly merge iseries do_IRQ

Hide some of the iseries details in iSeries_get_irq.
Signed-off-by: NStephen Rothwell <sfr@canb.auug.org.au>
上级 853f828c
...@@ -78,10 +78,6 @@ EXPORT_SYMBOL(__irq_offset_value); ...@@ -78,10 +78,6 @@ EXPORT_SYMBOL(__irq_offset_value);
static int ppc_spurious_interrupts; 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 #ifdef CONFIG_PPC32
#define NR_MASK_WORDS ((NR_IRQS + 31) / 32) #define NR_MASK_WORDS ((NR_IRQS + 31) / 32)
...@@ -195,49 +191,6 @@ void fixup_irqs(cpumask_t map) ...@@ -195,49 +191,6 @@ void fixup_irqs(cpumask_t map)
} }
#endif #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) void do_IRQ(struct pt_regs *regs)
{ {
int irq; int irq;
...@@ -286,16 +239,24 @@ void do_IRQ(struct pt_regs *regs) ...@@ -286,16 +239,24 @@ void do_IRQ(struct pt_regs *regs)
} else } else
#endif #endif
__do_IRQ(irq, regs); __do_IRQ(irq, regs);
} else } else if (irq != -2)
#ifdef CONFIG_PPC32 /* That's not SMP safe ... but who cares ? */
if (irq != -2) ppc_spurious_interrupts++;
#endif
/* That's not SMP safe ... but who cares ? */
ppc_spurious_interrupts++;
irq_exit(); 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) void __init init_IRQ(void)
{ {
......
...@@ -35,13 +35,19 @@ ...@@ -35,13 +35,19 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <asm/paca.h>
#include <asm/iseries/hv_types.h> #include <asm/iseries/hv_types.h>
#include <asm/iseries/hv_lp_event.h> #include <asm/iseries/hv_lp_event.h>
#include <asm/iseries/hv_call_xm.h> #include <asm/iseries/hv_call_xm.h>
#include <asm/iseries/it_lp_queue.h>
#include "irq.h" #include "irq.h"
#include "call_pci.h" #include "call_pci.h"
#if defined(CONFIG_SMP)
extern void iSeries_smp_message_recv(struct pt_regs *);
#endif
enum pci_event_type { enum pci_event_type {
pe_bus_created = 0, /* PHB has been created */ pe_bus_created = 0, /* PHB has been created */
pe_bus_error = 1, /* PHB has failed */ pe_bus_error = 1, /* PHB has failed */
...@@ -329,3 +335,24 @@ int __init iSeries_allocate_IRQ(HvBusNumber bus, ...@@ -329,3 +335,24 @@ int __init iSeries_allocate_IRQ(HvBusNumber bus,
irq_desc[virtirq].handler = &iSeries_IRQ_handler; irq_desc[virtirq].handler = &iSeries_IRQ_handler;
return virtirq; 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;
}
...@@ -4,5 +4,6 @@ ...@@ -4,5 +4,6 @@
extern void iSeries_init_IRQ(void); extern void iSeries_init_IRQ(void);
extern int iSeries_allocate_IRQ(HvBusNumber, HvSubBusNumber, HvAgentId); extern int iSeries_allocate_IRQ(HvBusNumber, HvSubBusNumber, HvAgentId);
extern void iSeries_activate_IRQs(void); extern void iSeries_activate_IRQs(void);
extern int iSeries_get_irq(struct pt_regs *);
#endif /* _ISERIES_IRQ_H */ #endif /* _ISERIES_IRQ_H */
...@@ -569,16 +569,6 @@ static void iSeries_show_cpuinfo(struct seq_file *m) ...@@ -569,16 +569,6 @@ static void iSeries_show_cpuinfo(struct seq_file *m)
seq_printf(m, "machine\t\t: 64-bit iSeries Logical Partition\n"); seq_printf(m, "machine\t\t: 64-bit iSeries Logical Partition\n");
} }
/*
* Document me.
* and Implement me.
*/
static int iSeries_get_irq(struct pt_regs *regs)
{
/* -2 means ignore this interrupt */
return -2;
}
/* /*
* Document me. * Document me.
*/ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册