mirror of
https://github.com/torvalds/linux.git
synced 2024-12-17 16:43:08 +00:00
powerpc: partly merge iseries do_IRQ
Hide some of the iseries details in iSeries_get_irq. Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
This commit is contained in:
parent
853f828cfd
commit
e199500c62
@ -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)
|
|||||||
}
|
}
|
||||||
#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)
|
|||||||
} 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();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_PPC_ISERIES */
|
irq_exit();
|
||||||
|
|
||||||
|
#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 @@
|
|||||||
#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,
|
|||||||
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 @@
|
|||||||
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)
|
|||||||
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.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user