Message ID | 1491482940-1163-8-git-send-email-amit.pundir@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | mips: IRQ stack patches from LEDE | expand |
Hi Amit, On Thu, Apr 06, 2017 at 06:19:00PM +0530, Amit Pundir wrote: > From: Felix Fietkau <nbd@nbd.name> > > With the IRQ stack changes integrated, the XRX200 devices started > emitting a constant stream of kernel messages like this: > > [ 565.415310] Spurious IRQ: CAUSE=0x1100c300 > > This is caused by IP0 getting handled by plat_irq_dispatch() rather than > its vectored interrupt handler, which is fixed by commit de856416e714 > ("MIPS: IRQ Stack: Fix erroneous jal to plat_irq_dispatch"). > > Fix plat_irq_dispatch() to handle non-vectored IPI interrupts correctly > by setting up IP2-6 as proper chained IRQ handlers and calling do_IRQ > for all MIPS CPU interrupts. > > Signed-off-by: Felix Fietkau <nbd@nbd.name> > Acked-by: John Crispin <john@phrozen.org> > Cc: linux-mips@linux-mips.org > Patchwork: https://patchwork.linux-mips.org/patch/15077/ > [james.hogan@imgtec.com: tweaked commit message] > Signed-off-by: James Hogan <james.hogan@imgtec.com> > > (cherry picked from commit 6c356eda225e3ee134ed4176b9ae3a76f793f4dd) > Signed-off-by: Amit Pundir <amit.pundir@linaro.org> Weren't you going to drop this one? Cheers James
Hi, On 6 April 2017 at 18:49, James Hogan <james.hogan@imgtec.com> wrote: > Hi Amit, > > On Thu, Apr 06, 2017 at 06:19:00PM +0530, Amit Pundir wrote: >> From: Felix Fietkau <nbd@nbd.name> >> >> With the IRQ stack changes integrated, the XRX200 devices started >> emitting a constant stream of kernel messages like this: >> >> [ 565.415310] Spurious IRQ: CAUSE=0x1100c300 >> >> This is caused by IP0 getting handled by plat_irq_dispatch() rather than >> its vectored interrupt handler, which is fixed by commit de856416e714 >> ("MIPS: IRQ Stack: Fix erroneous jal to plat_irq_dispatch"). >> >> Fix plat_irq_dispatch() to handle non-vectored IPI interrupts correctly >> by setting up IP2-6 as proper chained IRQ handlers and calling do_IRQ >> for all MIPS CPU interrupts. >> >> Signed-off-by: Felix Fietkau <nbd@nbd.name> >> Acked-by: John Crispin <john@phrozen.org> >> Cc: linux-mips@linux-mips.org >> Patchwork: https://patchwork.linux-mips.org/patch/15077/ >> [james.hogan@imgtec.com: tweaked commit message] >> Signed-off-by: James Hogan <james.hogan@imgtec.com> >> >> (cherry picked from commit 6c356eda225e3ee134ed4176b9ae3a76f793f4dd) >> Signed-off-by: Amit Pundir <amit.pundir@linaro.org> > > Weren't you going to drop this one? I thought you wanted me to drop this one because the dependent/relevant patches were not pushed to stable at that time. But I re-read your email and I missed one important part that this particular patch is valid for a separate bug introduced in IRQ stack stuff in 4.11. I missed that important part. My apologies for that. Again. Greg please drop this one for both 4.4 and 4.9. Regards, Amit Pundir > > Cheers > James
diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c index 2e7f60c..51cdc46 100644 --- a/arch/mips/lantiq/irq.c +++ b/arch/mips/lantiq/irq.c @@ -269,6 +269,11 @@ static void ltq_hw5_irqdispatch(void) DEFINE_HWx_IRQDISPATCH(5) #endif +static void ltq_hw_irq_handler(struct irq_desc *desc) +{ + ltq_hw_irqdispatch(irq_desc_get_irq(desc) - 2); +} + #ifdef CONFIG_MIPS_MT_SMP void __init arch_init_ipiirq(int irq, struct irqaction *action) { @@ -313,23 +318,19 @@ static struct irqaction irq_call = { asmlinkage void plat_irq_dispatch(void) { unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM; - unsigned int i; - - if ((MIPS_CPU_TIMER_IRQ == 7) && (pending & CAUSEF_IP7)) { - do_IRQ(MIPS_CPU_TIMER_IRQ); - goto out; - } else { - for (i = 0; i < MAX_IM; i++) { - if (pending & (CAUSEF_IP2 << i)) { - ltq_hw_irqdispatch(i); - goto out; - } - } + int irq; + + if (!pending) { + spurious_interrupt(); + return; } - pr_alert("Spurious IRQ: CAUSE=0x%08x\n", read_c0_status()); -out: - return; + pending >>= CAUSEB_IP; + while (pending) { + irq = fls(pending) - 1; + do_IRQ(MIPS_CPU_IRQ_BASE + irq); + pending &= ~BIT(irq); + } } static int icu_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) @@ -354,11 +355,6 @@ static const struct irq_domain_ops irq_domain_ops = { .map = icu_map, }; -static struct irqaction cascade = { - .handler = no_action, - .name = "cascade", -}; - int __init icu_of_init(struct device_node *node, struct device_node *parent) { struct device_node *eiu_node; @@ -390,7 +386,7 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent) mips_cpu_irq_init(); for (i = 0; i < MAX_IM; i++) - setup_irq(i + 2, &cascade); + irq_set_chained_handler(i + 2, ltq_hw_irq_handler); if (cpu_has_vint) { pr_info("Setting up vectored interrupts\n");