mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 15:44:04 +02:00
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 <olivier.martin@arm.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14433 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
ec6b73d7a6
commit
e703b085f6
@ -1,15 +1,15 @@
|
|||||||
/** @file
|
/** @file
|
||||||
Timer Architecture Protocol driver of the ARM flavor
|
Timer Architecture Protocol driver of the ARM flavor
|
||||||
|
|
||||||
Copyright (c) 2011 ARM Ltd. All rights reserved.<BR>
|
Copyright (c) 2011-2013 ARM Ltd. All rights reserved.<BR>
|
||||||
|
|
||||||
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,
|
This program and the accompanying materials
|
||||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
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.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
@ -336,6 +336,10 @@ TimerInitialize (
|
|||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
// Disable the timer
|
// Disable the timer
|
||||||
|
TimerCtrlReg = ArmArchTimerGetTimerCtrlReg ();
|
||||||
|
TimerCtrlReg |= ARM_ARCH_TIMER_IMASK;
|
||||||
|
TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE;
|
||||||
|
ArmArchTimerSetTimerCtrlReg (TimerCtrlReg);
|
||||||
Status = TimerDriverSetTimerPeriod (&gTimer, 0);
|
Status = TimerDriverSetTimerPeriod (&gTimer, 0);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
@ -349,11 +353,6 @@ TimerInitialize (
|
|||||||
Status = gInterrupt->RegisterInterruptSource (gInterrupt, PcdGet32 (PcdArmArchTimerIntrNum), TimerInterruptHandler);
|
Status = gInterrupt->RegisterInterruptSource (gInterrupt, PcdGet32 (PcdArmArchTimerIntrNum), TimerInterruptHandler);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
// Unmask timer interrupts
|
|
||||||
TimerCtrlReg = ArmArchTimerGetTimerCtrlReg ();
|
|
||||||
TimerCtrlReg &= ~ARM_ARCH_TIMER_IMASK;
|
|
||||||
ArmArchTimerSetTimerCtrlReg (TimerCtrlReg);
|
|
||||||
|
|
||||||
// Set up default timer
|
// Set up default timer
|
||||||
Status = TimerDriverSetTimerPeriod (&gTimer, FixedPcdGet32(PcdTimerPeriod)); // TIMER_DEFAULT_PERIOD
|
Status = TimerDriverSetTimerPeriod (&gTimer, FixedPcdGet32(PcdTimerPeriod)); // TIMER_DEFAULT_PERIOD
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
@ -366,11 +365,9 @@ TimerInitialize (
|
|||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR(Status);
|
ASSERT_EFI_ERROR(Status);
|
||||||
|
|
||||||
// enable Secure timer interrupts
|
// Everything is ready, unmask and enable timer interrupts
|
||||||
Status = gInterrupt->EnableInterruptSource (gInterrupt, PcdGet32 (PcdArmArchTimerSecIntrNum));
|
TimerCtrlReg = ARM_ARCH_TIMER_ENABLE;
|
||||||
|
ArmArchTimerSetTimerCtrlReg (TimerCtrlReg);
|
||||||
// enable NonSecure timer interrupts
|
|
||||||
Status = gInterrupt->EnableInterruptSource (gInterrupt, PcdGet32 (PcdArmArchTimerIntrNum));
|
|
||||||
|
|
||||||
// Register for an ExitBootServicesEvent
|
// Register for an ExitBootServicesEvent
|
||||||
Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY, ExitBootServicesEvent, NULL, &EfiExitBootServicesEvent);
|
Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY, ExitBootServicesEvent, NULL, &EfiExitBootServicesEvent);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user