diff options
author | oliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-06-03 09:33:35 +0000 |
---|---|---|
committer | oliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-06-03 09:33:35 +0000 |
commit | ce9cc403bdd8f8d7f8aeebdac40485bf8e0d7be6 (patch) | |
tree | 15c193ef2b04d71b9c579e9a677d37edd281ec18 /ArmPlatformPkg/Library | |
parent | 23792dea0ca521e8696c7994e9cc6d04581f0b2c (diff) | |
download | edk2-platforms-ce9cc403bdd8f8d7f8aeebdac40485bf8e0d7be6.tar.xz |
ArmPlatformPkg/SP804Timer: Introduce gArmPlatformTokenSpaceGuid.PcdSP804FrequencyInMHz
This PCD defines the speed of the SP804 timer. The default value is 1MHz.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11745 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'ArmPlatformPkg/Library')
-rw-r--r-- | ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.c | 29 | ||||
-rw-r--r-- | ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.inf | 7 |
2 files changed, 25 insertions, 11 deletions
diff --git a/ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.c b/ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.c index 96c43aa042..2508897391 100644 --- a/ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.c +++ b/ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.c @@ -74,11 +74,16 @@ MicroSecondDelay ( IN UINTN MicroSeconds ) { - // load the timer count register - MmioWrite32 (SP804_TIMER2_BASE + SP804_TIMER_LOAD_REG, MicroSeconds); + UINTN Index; - while (MmioRead32 (SP804_TIMER2_BASE + SP804_TIMER_CURRENT_REG) > 0) { - ; + // Reload the counter for each 1Mhz to avoid an overflow in the load value + for (Index = 0; Index < (UINTN)PcdGet32(PcdSP804FrequencyInMHz); Index++) { + // load the timer count register + MmioWrite32 (SP804_TIMER2_BASE + SP804_TIMER_LOAD_REG, MicroSeconds); + + while (MmioRead32 (SP804_TIMER2_BASE + SP804_TIMER_CURRENT_REG) > 0) { + ; + } } return MicroSeconds; @@ -100,17 +105,21 @@ NanoSecondDelay ( IN UINTN NanoSeconds ) { - UINT32 MicroSeconds; + UINTN Index; + UINT32 MicroSeconds; // Round up to 1us Tick Number MicroSeconds = (UINT32)NanoSeconds / 1000; MicroSeconds += ((UINT32)NanoSeconds % 1000) == 0 ? 0 : 1; - // load the timer count register - MmioWrite32 (SP804_TIMER2_BASE + SP804_TIMER_LOAD_REG, MicroSeconds); + // Reload the counter for each 1Mhz to avoid an overflow in the load value + for (Index = 0; Index < (UINTN)PcdGet32(PcdSP804FrequencyInMHz); Index++) { + // load the timer count register + MmioWrite32 (SP804_TIMER2_BASE + SP804_TIMER_LOAD_REG, MicroSeconds); - while (MmioRead32 (SP804_TIMER2_BASE + SP804_TIMER_CURRENT_REG) > 0) { - ; + while (MmioRead32 (SP804_TIMER2_BASE + SP804_TIMER_CURRENT_REG) > 0) { + ; + } } return NanoSeconds; @@ -182,5 +191,5 @@ GetPerformanceCounterProperties ( *EndValue = 0xFFFFFFFF; } - return 1000000; + return PcdGet64 (PcdEmbeddedPerformanceCounterFrequencyInHz); } diff --git a/ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.inf b/ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.inf index 7481236c2f..1cbb32ecb6 100644 --- a/ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.inf +++ b/ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.inf @@ -2,7 +2,7 @@ # Timer library implementation # # -# Copyright (c) 2010, ARM Ltd. All rights reserved.<BR> +# Copyright (c) 2011, 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 @@ -30,8 +30,13 @@ MdePkg/MdePkg.dec ArmPkg/ArmPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec + EmbeddedPkg/EmbeddedPkg.dec [LibraryClasses] DebugLib IoLib BaseLib + +[Pcd] + gArmPlatformTokenSpaceGuid.PcdSP804FrequencyInMHz + gEmbeddedTokenSpaceGuid.PcdEmbeddedPerformanceCounterFrequencyInHz |