From e703b085f6a3a2e7a61be97d9154437520b3ae75 Mon Sep 17 00:00:00 2001 From: Olivier Martin Date: Wed, 19 Jun 2013 18:08:02 +0000 Subject: [PATCH] ArmPkg/Drivers/TimerDxe: Improve Timer initialisation. - Registering a interrupt handler implicitly enables said interrupt. This is in the UEFI Spec. No need to enable the interrupts a second time. - Make sure the Timer is completely disabled before configuring it. Only enable after configuration is complete. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Olivier Martin git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14433 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmPkg/Drivers/TimerDxe/TimerDxe.c | 33 ++++++++++++++---------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/ArmPkg/Drivers/TimerDxe/TimerDxe.c b/ArmPkg/Drivers/TimerDxe/TimerDxe.c index cbc34e8e41..dabcc8313b 100644 --- a/ArmPkg/Drivers/TimerDxe/TimerDxe.c +++ b/ArmPkg/Drivers/TimerDxe/TimerDxe.c @@ -1,15 +1,15 @@ /** @file Timer Architecture Protocol driver of the ARM flavor - Copyright (c) 2011 ARM Ltd. All rights reserved.
- - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php + Copyright (c) 2011-2013 ARM Ltd. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ @@ -336,6 +336,10 @@ TimerInitialize ( ASSERT_EFI_ERROR (Status); // Disable the timer + TimerCtrlReg = ArmArchTimerGetTimerCtrlReg (); + TimerCtrlReg |= ARM_ARCH_TIMER_IMASK; + TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE; + ArmArchTimerSetTimerCtrlReg (TimerCtrlReg); Status = TimerDriverSetTimerPeriod (&gTimer, 0); ASSERT_EFI_ERROR (Status); @@ -349,11 +353,6 @@ TimerInitialize ( Status = gInterrupt->RegisterInterruptSource (gInterrupt, PcdGet32 (PcdArmArchTimerIntrNum), TimerInterruptHandler); ASSERT_EFI_ERROR (Status); - // Unmask timer interrupts - TimerCtrlReg = ArmArchTimerGetTimerCtrlReg (); - TimerCtrlReg &= ~ARM_ARCH_TIMER_IMASK; - ArmArchTimerSetTimerCtrlReg (TimerCtrlReg); - // Set up default timer Status = TimerDriverSetTimerPeriod (&gTimer, FixedPcdGet32(PcdTimerPeriod)); // TIMER_DEFAULT_PERIOD ASSERT_EFI_ERROR (Status); @@ -366,11 +365,9 @@ TimerInitialize ( ); ASSERT_EFI_ERROR(Status); - // enable Secure timer interrupts - Status = gInterrupt->EnableInterruptSource (gInterrupt, PcdGet32 (PcdArmArchTimerSecIntrNum)); - - // enable NonSecure timer interrupts - Status = gInterrupt->EnableInterruptSource (gInterrupt, PcdGet32 (PcdArmArchTimerIntrNum)); + // Everything is ready, unmask and enable timer interrupts + TimerCtrlReg = ARM_ARCH_TIMER_ENABLE; + ArmArchTimerSetTimerCtrlReg (TimerCtrlReg); // Register for an ExitBootServicesEvent Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY, ExitBootServicesEvent, NULL, &EfiExitBootServicesEvent); -- 2.39.2