]> git.proxmox.com Git - mirror_edk2.git/blobdiff - PcAtChipsetPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c
PcAtChipsetPkg: Add PeiAcpiTimerLib to save Frequency in HOB
[mirror_edk2.git] / PcAtChipsetPkg / Library / AcpiTimerLib / DxeAcpiTimerLib.c
index 7f7b0f8f62947712e3a3a3d66df51ddeece1c14a..67e18a13607fbf82f55741d612e0eb844bab276d 100644 (file)
 \r
 **/\r
 \r
-#include <Base.h>\r
+#include <PiDxe.h>\r
 #include <Library/TimerLib.h>\r
 #include <Library/BaseLib.h>\r
+#include <Library/HobLib.h>\r
+\r
+extern GUID mFrequencyHobGuid;\r
+\r
+/**\r
+  The constructor function enables ACPI IO space.\r
+\r
+  If ACPI I/O space not enabled, this function will enable it.\r
+  It will always return RETURN_SUCCESS.\r
+\r
+  @retval EFI_SUCCESS   The constructor always returns RETURN_SUCCESS.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AcpiTimerLibConstructor (\r
+  VOID\r
+  );\r
 \r
 /**\r
   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
@@ -54,8 +72,41 @@ InternalGetPerformanceCounterFrequency (
   VOID\r
   ) \r
 {\r
-  if (mPerformanceCounterFrequency == 0) {\r
+  return  mPerformanceCounterFrequency;\r
+}\r
+\r
+/**\r
+  The constructor function enables ACPI IO space, and caches PerformanceCounterFrequency. \r
+\r
+  @param  ImageHandle   The firmware allocated handle for the EFI image.\r
+  @param  SystemTable   A pointer to the EFI System Table.\r
+\r
+  @retval EFI_SUCCESS   The constructor always returns RETURN_SUCCESS.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DxeAcpiTimerLibConstructor (\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
+  )\r
+{\r
+  EFI_HOB_GUID_TYPE   *GuidHob;\r
+\r
+  //\r
+  // Enable ACPI IO space.\r
+  //\r
+  AcpiTimerLibConstructor ();\r
+\r
+  //\r
+  // Initialize PerformanceCounterFrequency\r
+  //\r
+  GuidHob = GetFirstGuidHob (&mFrequencyHobGuid);\r
+  if (GuidHob != NULL) {\r
+    mPerformanceCounterFrequency = *(UINT64*)GET_GUID_HOB_DATA (GuidHob);\r
+  } else {\r
     mPerformanceCounterFrequency = InternalCalculateTscFrequency ();\r
   }\r
-  return  mPerformanceCounterFrequency;\r
+\r
+  return EFI_SUCCESS;\r
 }\r