From e100fa8c1e5218865ff6f2c5dd646c2e6ceca49d Mon Sep 17 00:00:00 2001 From: oliviermartin Date: Thu, 31 Mar 2011 11:35:10 +0000 Subject: ArmPlatformPkg/SP804Timer: Fix IRQ handler when the Timer IRQ is shared 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 | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'ArmPlatformPkg/Drivers') diff --git a/ArmPlatformPkg/Drivers/SP804TimerDxe/SP804Timer.c b/ArmPlatformPkg/Drivers/SP804TimerDxe/SP804Timer.c index c6b72ad7ac..a28a045352 100644 --- a/ArmPlatformPkg/Drivers/SP804TimerDxe/SP804Timer.c +++ b/ArmPlatformPkg/Drivers/SP804TimerDxe/SP804Timer.c @@ -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); -- cgit v1.2.3