Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 17133
b: refs/heads/master
c: e199500
h: refs/heads/master
i:
  17131: 0ab2a18
v: v3
  • Loading branch information
Stephen Rothwell authored and Paul Mackerras committed Jan 9, 2006
1 parent 184c299 commit 891c5c5
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 66 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 853f828cfd29d3d486d9f4b4df91d99ce509e3b5
refs/heads/master: e199500c6280aadf98c185db99fd24ab61ebe0c7
71 changes: 16 additions & 55 deletions trunk/arch/powerpc/kernel/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down
27 changes: 27 additions & 0 deletions trunk/arch/powerpc/platforms/iseries/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,19 @@
#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 */
Expand Down Expand Up @@ -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;
}
1 change: 1 addition & 0 deletions trunk/arch/powerpc/platforms/iseries/irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
10 changes: 0 additions & 10 deletions trunk/arch/powerpc/platforms/iseries/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}

/*
* Document me.
* and Implement me.
*/
static int iSeries_get_irq(struct pt_regs *regs)
{
/* -2 means ignore this interrupt */
return -2;
}

/*
* Document me.
*/
Expand Down

0 comments on commit 891c5c5

Please sign in to comment.