Loading arch/powerpc/kernel/irq.c +16 −55 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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; Loading Loading @@ -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) { Loading arch/powerpc/platforms/iseries/irq.c +27 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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; } arch/powerpc/platforms/iseries/irq.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 */ arch/powerpc/platforms/iseries/setup.c +0 −10 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading
arch/powerpc/kernel/irq.c +16 −55 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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; Loading Loading @@ -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) { Loading
arch/powerpc/platforms/iseries/irq.c +27 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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; }
arch/powerpc/platforms/iseries/irq.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 */
arch/powerpc/platforms/iseries/setup.c +0 −10 Original line number Diff line number Diff line Loading @@ -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. */ Loading