Skip to contentSkip to conversation

microblaze: avoid interrupt race conditions

PATCH New Stephan Linz 2 participants 2 messages Feb 22, 2012 – Feb 23, 2012 Microblaze architecture

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 microblaze: avoid interrupt race conditions

The interrupt acknowledge action have to run after the registered interrupt handler. So we have a chance to bear out the corresponding interrupt request in the corresponding controller hardware.

With this reordering, we optain a proper interrupt handling for level triggered interrupt sources -- for example the new axi_timer v1.02.a introduced in ISE 13.2.

---
 arch/microblaze/cpu/interrupts.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
arch/microblaze/cpu/interrupts.c +2 -2
index 5a13211..e7ca859 100644
@@ -155,8 +155,6 @@ void interrupt_handler (void)
 #endif
 	struct irq_action *act = vecs + irqs;
 
-	intc->iar = mask << irqs;
-
 #ifdef DEBUG_INT
 	printf
 	    ("Jumping to interrupt handler rutine addr %x,count %x,arg %x\n",
@@ -165,6 +163,8 @@ void interrupt_handler (void)
 	act->handler (act->arg);
 	act->count++;
 
+	intc->iar = mask << irqs;
+
 #ifdef DEBUG_INT
 	printf ("Dump INTC reg, isr %x, ier %x, iar %x, mer %x\n", intc->isr,
 		intc->ier, intc->iar, intc->mer);
Signature · 1 line
1.7.0.4
maintainer Applied
#1 lore raw

PATCH 1/1 microblaze: avoid interrupt race conditions

Quoted 29 lines · Stephan Linz

The interrupt acknowledge action have to run after the registered interrupt handler. So we have a chance to bear out the corresponding interrupt request in the corresponding controller hardware.

With this reordering, we optain a proper interrupt handling for level triggered interrupt sources -- for example the new axi_timer v1.02.a introduced in ISE 13.2.

---
 arch/microblaze/cpu/interrupts.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
arch/microblaze/cpu/interrupts.c +0 -2
index 5a13211..e7ca859 100644
@@ -155,8 +155,6 @@ void interrupt_handler (void)
 #endif
 	struct irq_action *act = vecs + irqs;
 
-	intc->iar = mask << irqs;
-
 #ifdef DEBUG_INT
 	printf
 	    ("Jumping to interrupt handler rutine addr %x,count %x,arg %x\n",

arch/microblaze/cpu/interrupts.c void interrupt_handler (void) · line 170

Quoted 8 lines
arch/microblaze/cpu/interrupts.c +2 -0
@@ -165,6 +163,8 @@ void interrupt_handler (void)
 	act->handler (act->arg);
 	act->count++;
 
+	intc->iar = mask << irqs;
+
 #ifdef DEBUG_INT
 	printf ("Dump INTC reg, isr %x, ier %x, iar %x, mer %x\n", intc->isr,
 		intc->ier, intc->iar, intc->mer);

Applied.

Thanks,
Michal

Signature · 4 lines
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel 2.6 Microblaze Linux - http://www.monstr.eu/fdt/
Microblaze U-BOOT custodian