GIC: Dont disable INT in ack callback
Subsystems (2)
PATCH 1/1 GIC: Dont disable INT in ack callback
From: Abhijeet Dharmapurikar <[email protected]>
Unless gic_ack_irq is called from __do_IRQ, interrupt should not be disabled in the ack function. Disabling the interrupt causes handle_edge_irq to never enable it again.
--- arch/arm/common/gic.c | 31 ++++++++++++++++++------------- 1 files changed, 18 insertions(+), 13 deletions(-)
arch/arm/common/gic.c +18 -13
@@ -67,25 +67,30 @@ static inline unsigned int gic_irq(unsigned int irq)/* * Routines to acknowledge, disable and enable interrupts -* -* Linux assumes that when we're done with an interrupt we need to -* unmask it, in the same way we need to unmask an interrupt when -* we first enable it. -* -* The GIC has a separate notion of "end of interrupt" to re-enable -* an interrupt after handling, in order to support hardware -* prioritisation. -* -* We can make the GIC behave in the way that Linux expects by making -* our "acknowledge" routine disable the interrupt, then mark it as -* complete. */ static void gic_ack_irq (unsigned int irq) { -u32 mask =1 << (irq %32 );spin_lock (&irq_controller_lock); + +#ifndef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ +u32 mask =1 << (irq %32 ); + +/* +* Linux assumes that when we're done with an interrupt we need to +* unmask it, in the same way we need to unmask an interrupt when +* we first enable it. +* +* The GIC has a separate notion of "end of interrupt" to re-enable +* an interrupt after handling, in order to support hardware +* prioritisation. +* +* We can make the GIC behave in the way that Linux expects by making +* our "acknowledge" routine disable the interrupt, then mark it as +* complete. +*/ writel (mask,gic_dist_base (irq) +GIC_DIST_ENABLE_CLEAR + (gic_irq (irq) /32 ) *4 ); +#endif writel (gic_irq (irq),gic_cpu_base (irq) +GIC_CPU_EOI );spin_unlock (&irq_controller_lock); }
Signature · 1 line
1.7.1
Quoted 3 lines · Jeff Ohlstein
Unless
gic_ack_irqis called from__do_IRQ, interrupt should not be disabled in the ack function. Disabling the interrupt causeshandle_edge_irqto never enable it again.
The GIC doesn't use handle_edge_irq.
Anyway, this change is correct since gic_ack_irq is currently doing a maskack, when it should be just an ack. However, since GENERIC_HARDIRQS_NO__DO_IRQ is always true on ARM, I don't see a need to add the ifndef.
PATCH v2 1/1 GIC: Dont disable INT in ack callback
From: Abhijeet Dharmapurikar <[email protected]>
Unless gic_ack_irq is called from __do_IRQ, interrupt should not be disabled in the ack function.
--- arch/arm/common/gic.c | 15 --------------- 1 files changed, 0 insertions(+), 15 deletions(-)
arch/arm/common/gic.c +0 -15
@@ -67,25 +67,10 @@ static inline unsigned int gic_irq(unsigned int irq)/* * Routines to acknowledge, disable and enable interrupts -* -* Linux assumes that when we're done with an interrupt we need to -* unmask it, in the same way we need to unmask an interrupt when -* we first enable it. -* -* The GIC has a separate notion of "end of interrupt" to re-enable -* an interrupt after handling, in order to support hardware -* prioritisation. -* -* We can make the GIC behave in the way that Linux expects by making -* our "acknowledge" routine disable the interrupt, then mark it as -* complete. */ static void gic_ack_irq (unsigned int irq) { -u32 mask =1 << (irq %32 ); -spin_lock (&irq_controller_lock); -writel (mask,gic_dist_base (irq) +GIC_DIST_ENABLE_CLEAR + (gic_irq (irq) /32 ) *4 );writel (gic_irq (irq),gic_cpu_base (irq) +GIC_CPU_EOI );spin_unlock (&irq_controller_lock); }
Signature · 4 lines
1.7.1.1 Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.