ArmPkg/TimerDxe: Changed calculation to allow 1KHz granularity frequency

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
diff --git a/ArmPkg/Drivers/TimerDxe/TimerDxe.c b/ArmPkg/Drivers/TimerDxe/TimerDxe.c
index 633876b..ccdb38c 100644
--- a/ArmPkg/Drivers/TimerDxe/TimerDxe.c
+++ b/ArmPkg/Drivers/TimerDxe/TimerDxe.c
@@ -141,12 +141,13 @@
   ArmArchTimerDisableTimer ();

 

   if (TimerPeriod != 0) {

-    // Convert TimerPeriod to micro sec units

-    TimerTicks = DivU64x32 (TimerPeriod, 10);

+    // TimerTicks = TimerPeriod in 1ms unit x Frequency.10^-3

+    //            = TimerPeriod.10^-4 x Frequency.10^-3

+    //            = (TimerPeriod x Frequency) x 10^-7

+    TimerTicks = MultU64x32 (TimerPeriod, FixedPcdGet32 (PcdArmArchTimerFreqInHz));

+    TimerTicks = DivU64x32 (TimerTicks, 10000000U);

 

-    TimerTicks = MultU64x32 (TimerTicks, (PcdGet32(PcdArmArchTimerFreqInHz)/1000000));

-

-    ArmArchTimerSetTimerVal((UINTN)TimerTicks);

+    ArmArchTimerSetTimerVal ((UINTN)TimerTicks);

 

     // Enable the timer

     ArmArchTimerEnableTimer ();

diff --git a/ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.c b/ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.c
index d1cd0c8..4fe7cb8 100644
--- a/ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.c
+++ b/ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.c
@@ -82,8 +82,10 @@
   UINT64 TimerTicks64;

   UINT64 SystemCounterVal;

 

-  // Calculate counter ticks that can represent requested delay

-  TimerTicks64 = MultU64x32 (MicroSeconds, TICKS_PER_MICRO_SEC);

+  // Calculate counter ticks that can represent requested delay:

+  //  = MicroSeconds x TICKS_PER_MICRO_SEC

+  //  = MicroSeconds x Frequency.10^-6

+  TimerTicks64 = (MicroSeconds * PcdGet32 (PcdArmArchTimerFreqInHz)) / 1000000U;

 

   // Read System Counter value

   SystemCounterVal = ArmArchTimerGetSystemCount ();