Patch "irqchip/omap-intc: Add support for spurious irq handling" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
irqchip/omap-intc: Add support for spurious irq handling
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
irqchip-omap-intc-add-support-for-spurious-irq-handling.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
d3b421cd07e4c0d4d6c0bbd55ca169c054fc081dMon Sep 17 00:00:00 2001
From: Sekhar Nori <[email protected]>
Date: Tue, 15 Dec 2015 19:56:12 +0530
Subject: irqchip/omap-intc: Add support for spurious irq handling
From: Sekhar Nori <[email protected]>
commit d3b421cd07e4c0d4d6c0bbd55ca169c054fc081d upstream.
Under some conditions, irq sorting procedure used by INTC can go wrong resulting in a spurious irq getting reported.
If this condition is not handled, it results in endless stream of:
unexpected IRQ trap at vector 00
messages from ack_bad_irq()
Handle the spurious interrupt condition in omap-intc driver to prevent this.
Measurements using kernel function profiler on AM335x EVM running at 720MHz show that after this patch omap_intc_handle_irq() takes about 37.4us against 34us before this patch.
--- drivers/irqchip/irq-omap-intc.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-)
drivers/irqchip/irq-omap-intc.c +26 -1
@@ -47,6 +47,7 @@#define INTC_ILR0 0x0100#define ACTIVEIRQ_MASK 0x7f/* omap2/3 active interrupt bits */ +#define SPURIOUSIRQ_MASK (0x1ffffff << 7)#define INTCPS_NR_ILR_REGS 128#define INTCPS_NR_MIR_REGS 4
@@ -330,11 +331,35 @@ static int __init omap_init_irq(u32 base static asmlinkage void __exception_irq_entryomap_intc_handle_irq (struct pt_regs *regs) { +extern unsigned long irq_err_count;u32 irqnr; irqnr =intc_readl (INTC_SIR ); + +/* +* A spurious IRQ can result if interrupt that triggered the +* sorting is no longer active during the sorting (10 INTC +* functional clock cycles after interrupt assertion). Or a +* change in interrupt mask affected the result during sorting +* time. There is no special handling required except ignoring +* the SIR register value just read and retrying. +* See section 6.2.5 of AM335x TRM Literature Number: SPRUH73K +* +* Many a times, a spurious interrupt situation has been fixed +* by adding a flush for the posted write acking the IRQ in +* the device driver. Typically, this is going be the device +* driver whose interrupt was handled just before the spurious +* IRQ occurred. Pay attention to those device drivers if you +* run into hitting the spurious IRQ condition below. +*/ +if (unlikely ((irqnr &SPURIOUSIRQ_MASK ) ==SPURIOUSIRQ_MASK )) { +pr_err_once ("%s: spurious irq!\n" , __func__); + irq_err_count++; +omap_ack_irq (NULL ); +return ; + } + irqnr &=ACTIVEIRQ_MASK ; -WARN_ONCE (!irqnr,"Spurious IRQ ?\n" );handle_domain_irq (domain, irqnr, regs); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/irqchip-omap-intc-add-support-for-spurious-irq-handling.patch