]> git.proxmox.com Git - mirror_edk2.git/commitdiff
PcAtChipsetPkg AcpiTimerLib: Wait 363 ACPI timer counts to get TSC Freq
authorStar Zeng <star.zeng@intel.com>
Wed, 17 Aug 2016 02:08:31 +0000 (10:08 +0800)
committerStar Zeng <star.zeng@intel.com>
Thu, 18 Aug 2016 03:01:54 +0000 (11:01 +0800)
Compute the number of ticks to wait to measure TSC frequency.
Instead of (ACPI_TIMER_FREQUENCY / 10000) = 357 and 357 * 10000 = 3570000,
use 363 * 9861 = 3579543 Hz which is within 2 Hz of ACPI_TIMER_FREQUENCY.
363 counts is a calibration time of 101.4 uS.

The idea comes from Michael and Paolo.

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Paul A Lohr <paul.a.lohr@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
PcAtChipsetPkg/Library/AcpiTimerLib/AcpiTimerLib.c
PcAtChipsetPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c
PcAtChipsetPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c

index e6fea231123d9740964fa24b08ba9bc8b92aec19..020031e3f4a53c62eb14db7c6e1e113b145e40c5 100644 (file)
@@ -340,13 +340,13 @@ GetTimeInNanoSecond (
   Calculate TSC frequency.\r
 \r
   The TSC counting frequency is determined by comparing how far it counts\r
-  during a 100us period as determined by the ACPI timer. The ACPI timer is\r
-  used because it counts at a known frequency.\r
-  The TSC is sampled, followed by waiting for ACPI_TIMER_FREQUENCY / 10000\r
-  clocks of the ACPI timer, or 100us. The TSC is then sampled again. The\r
-  difference multiplied by 10000 is the TSC frequency. There will be a small\r
-  error because of the overhead of reading the ACPI timer. An attempt is\r
-  made to determine and compensate for this error.\r
+  during a 101.4 us period as determined by the ACPI timer.\r
+  The ACPI timer is used because it counts at a known frequency.\r
+  The TSC is sampled, followed by waiting 363 counts of the ACPI timer,\r
+  or 101.4 us. The TSC is then sampled again. The difference multiplied by\r
+  9861 is the TSC frequency. There will be a small error because of the\r
+  overhead of reading the ACPI timer. An attempt is made to determine and\r
+  compensate for this error.\r
 \r
   @return The number of TSC counts per second.\r
 \r
@@ -366,22 +366,28 @@ InternalCalculateTscFrequency (
   InterruptState = SaveAndDisableInterrupts ();\r
 \r
   TimerAddr = InternalAcpiGetAcpiTimerIoPort ();\r
-  Ticks = IoRead32 (TimerAddr) + (ACPI_TIMER_FREQUENCY / 10000);    // Set Ticks to 100us in the future\r
+  //\r
+  // Compute the number of ticks to wait to measure TSC frequency.\r
+  // Use 363 * 9861 = 3579543 Hz which is within 2 Hz of ACPI_TIMER_FREQUENCY.\r
+  // 363 counts is a calibration time of 101.4 uS.\r
+  //\r
+  Ticks = IoRead32 (TimerAddr) + 363;\r
 \r
   StartTSC = AsmReadTsc ();                                         // Get base value for the TSC\r
   //\r
-  // Wait until the ACPI timer has counted 100us.\r
+  // Wait until the ACPI timer has counted 101.4 us.\r
   // Timer wrap-arounds are handled correctly by this function.\r
-  // When the current ACPI timer value is greater than 'Ticks', the while loop will exit.\r
+  // When the current ACPI timer value is greater than 'Ticks',\r
+  // the while loop will exit.\r
   //\r
   while (((Ticks - IoRead32 (TimerAddr)) & BIT23) == 0) {\r
     CpuPause();\r
   }\r
-  EndTSC = AsmReadTsc ();                                           // TSC value 100us later\r
+  EndTSC = AsmReadTsc ();                                           // TSC value 101.4 us later\r
 \r
   TscFrequency = MultU64x32 (\r
-                   (EndTSC - StartTSC),                             // Number of TSC counts in 100us\r
-                   10000                                            // Number of 100us in a second\r
+                   (EndTSC - StartTSC),                             // Number of TSC counts in 101.4 us\r
+                   9861                                             // Number of 101.4 us in a second\r
                    );\r
 \r
   SetInterruptState (InterruptState);\r
index 8819ebcfccef7446c88254b5c189052a3badfd64..29521f8b220b062541015318751cf38d0f373065 100644 (file)
   Calculate TSC frequency.\r
 \r
   The TSC counting frequency is determined by comparing how far it counts\r
-  during a 100us period as determined by the ACPI timer. The ACPI timer is\r
-  used because it counts at a known frequency.\r
-  The TSC is sampled, followed by waiting for ACPI_TIMER_FREQUENCY / 10000\r
-  clocks of the ACPI timer, or 100us. The TSC is then sampled again. The\r
-  difference multiplied by 10000 is the TSC frequency. There will be a small\r
-  error because of the overhead of reading the ACPI timer. An attempt is\r
-  made to determine and compensate for this error.\r
+  during a 101.4 us period as determined by the ACPI timer.\r
+  The ACPI timer is used because it counts at a known frequency.\r
+  The TSC is sampled, followed by waiting 363 counts of the ACPI timer,\r
+  or 101.4 us. The TSC is then sampled again. The difference multiplied by\r
+  9861 is the TSC frequency. There will be a small error because of the\r
+  overhead of reading the ACPI timer. An attempt is made to determine and\r
+  compensate for this error.\r
 \r
   @return The number of TSC counts per second.\r
 \r
index 7f7b0f8f62947712e3a3a3d66df51ddeece1c14a..b141c680fb823c59f08efd624d46a9731b3ff224 100644 (file)
   Calculate TSC frequency.\r
 \r
   The TSC counting frequency is determined by comparing how far it counts\r
-  during a 100us period as determined by the ACPI timer. The ACPI timer is\r
-  used because it counts at a known frequency.\r
-  The TSC is sampled, followed by waiting for ACPI_TIMER_FREQUENCY / 10000\r
-  clocks of the ACPI timer, or 100us. The TSC is then sampled again. The\r
-  difference multiplied by 10000 is the TSC frequency. There will be a small\r
-  error because of the overhead of reading the ACPI timer. An attempt is\r
-  made to determine and compensate for this error.\r
+  during a 101.4 us period as determined by the ACPI timer.\r
+  The ACPI timer is used because it counts at a known frequency.\r
+  The TSC is sampled, followed by waiting 363 counts of the ACPI timer,\r
+  or 101.4 us. The TSC is then sampled again. The difference multiplied by\r
+  9861 is the TSC frequency. There will be a small error because of the\r
+  overhead of reading the ACPI timer. An attempt is made to determine and\r
+  compensate for this error.\r
 \r
   @return The number of TSC counts per second.\r
 \r