Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e199500c authored by Stephen Rothwell's avatar Stephen Rothwell Committed by Paul Mackerras
Browse files

powerpc: partly merge iseries do_IRQ



Hide some of the iseries details in iSeries_get_irq.

Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
parent 853f828c
Loading
Loading
Loading
Loading
+16 −55
Original line number Diff line number Diff line
@@ -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
	} 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)
{
+27 −0
Original line number Diff line number Diff line
@@ -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 */
@@ -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 −0
Original line number Diff line number Diff line
@@ -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 */
+0 −10
Original line number Diff line number Diff line
@@ -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.
 */