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
This commit is contained in:
oliviermartin 2011-03-31 11:35:10 +00:00
parent 1e6a5cfcec
commit e100fa8c1e
1 changed files with 9 additions and 7 deletions

View File

@ -74,15 +74,17 @@ TimerInterruptHandler (
// //
OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL); 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 if (mTimerNotifyFunction) {
gInterrupt->EndOfInterrupt (gInterrupt, Source); mTimerNotifyFunction (mTimerPeriod);
}
if (mTimerNotifyFunction) {
mTimerNotifyFunction (mTimerPeriod);
} }
gBS->RestoreTPL (OriginalTPL); gBS->RestoreTPL (OriginalTPL);