]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPlatformPkg/SP804Timer: Fix IRQ handler when the Timer IRQ is shared
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 31 Mar 2011 11:35:10 +0000 (11:35 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 31 Mar 2011 11:35:10 +0000 (11:35 +0000)
The handler must check if the raised interrupt belongs to the SP804
Timer controller.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11473 6f19259b-4bc3-4df7-8a09-765794883524

ArmPlatformPkg/Drivers/SP804TimerDxe/SP804Timer.c

index c6b72ad7acff92d26a78ac7162a9e5a26fa94c83..a28a045352cf5c6a864e23a424e78654b8236820 100644 (file)
@@ -74,15 +74,17 @@ TimerInterruptHandler (
   //
   OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL);
 
-  // clear the periodic interrupt
+  // If the interrupt is shared then we must check if this interrupt source is the one associated to this Timer
+  if (MmioRead32 (SP804_TIMER0_BASE + SP804_TIMER_MSK_INT_STS_REG) != 0) {
+    // clear the periodic interrupt
+    MmioWrite32 (SP804_TIMER0_BASE + SP804_TIMER_INT_CLR_REG, 0);
 
-  MmioWrite32 (SP804_TIMER0_BASE + SP804_TIMER_INT_CLR_REG, 0);
+    // signal end of interrupt early to help avoid losing subsequent ticks from long duration handlers
+    gInterrupt->EndOfInterrupt (gInterrupt, Source);
 
-  // signal end of interrupt early to help avoid losing subsequent ticks from long duration handlers
-  gInterrupt->EndOfInterrupt (gInterrupt, Source);
-
-  if (mTimerNotifyFunction) {
-    mTimerNotifyFunction (mTimerPeriod);
+    if (mTimerNotifyFunction) {
+      mTimerNotifyFunction (mTimerPeriod);
+    }
   }
 
   gBS->RestoreTPL (OriginalTPL);