]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg/TimerDxe: Changed calculation to allow 1KHz granularity frequency
authorOlivier Martin <olivier.martin@arm.com>
Wed, 27 Aug 2014 10:12:00 +0000 (10:12 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 27 Aug 2014 10:12:00 +0000 (10:12 +0000)
Prior to this change the frequency was rounded to 1Mhz.
This change rounds the timer frequency to 1KHz.

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@15921 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/Drivers/TimerDxe/TimerDxe.c
ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.c

index 633876bea6bdced36ef7268ce3b1f2eaea465d7e..ccdb38c79b641c71b46728d558f177cc400a5a6e 100644 (file)
@@ -141,12 +141,13 @@ TimerDriverSetTimerPeriod (
   ArmArchTimerDisableTimer ();\r
 \r
   if (TimerPeriod != 0) {\r
-    // Convert TimerPeriod to micro sec units\r
-    TimerTicks = DivU64x32 (TimerPeriod, 10);\r
+    // TimerTicks = TimerPeriod in 1ms unit x Frequency.10^-3\r
+    //            = TimerPeriod.10^-4 x Frequency.10^-3\r
+    //            = (TimerPeriod x Frequency) x 10^-7\r
+    TimerTicks = MultU64x32 (TimerPeriod, FixedPcdGet32 (PcdArmArchTimerFreqInHz));\r
+    TimerTicks = DivU64x32 (TimerTicks, 10000000U);\r
 \r
-    TimerTicks = MultU64x32 (TimerTicks, (PcdGet32(PcdArmArchTimerFreqInHz)/1000000));\r
-\r
-    ArmArchTimerSetTimerVal((UINTN)TimerTicks);\r
+    ArmArchTimerSetTimerVal ((UINTN)TimerTicks);\r
 \r
     // Enable the timer\r
     ArmArchTimerEnableTimer ();\r
index d1cd0c8e6e3c9c2de0a8e3fe5156dec91ab1dc83..4fe7cb8d648f1d0663ddfb5c5a1602e1eb61e69b 100644 (file)
@@ -82,8 +82,10 @@ MicroSecondDelay (
   UINT64 TimerTicks64;\r
   UINT64 SystemCounterVal;\r
 \r
-  // Calculate counter ticks that can represent requested delay\r
-  TimerTicks64 = MultU64x32 (MicroSeconds, TICKS_PER_MICRO_SEC);\r
+  // Calculate counter ticks that can represent requested delay:\r
+  //  = MicroSeconds x TICKS_PER_MICRO_SEC\r
+  //  = MicroSeconds x Frequency.10^-6\r
+  TimerTicks64 = (MicroSeconds * PcdGet32 (PcdArmArchTimerFreqInHz)) / 1000000U;\r
 \r
   // Read System Counter value\r
   SystemCounterVal = ArmArchTimerGetSystemCount ();\r