summaryrefslogtreecommitdiff
path: root/ArmPlatformPkg/Library/SP804TimerLib
diff options
context:
space:
mode:
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>2011-06-03 09:33:35 +0000
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>2011-06-03 09:33:35 +0000
commitce9cc403bdd8f8d7f8aeebdac40485bf8e0d7be6 (patch)
tree15c193ef2b04d71b9c579e9a677d37edd281ec18 /ArmPlatformPkg/Library/SP804TimerLib
parent23792dea0ca521e8696c7994e9cc6d04581f0b2c (diff)
downloadedk2-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/SP804TimerLib')
-rw-r--r--ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.c29
-rw-r--r--ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.inf7
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