PcAtChipsetPkg: Add PeiAcpiTimerLib to save Frequency in HOB
[mirror_edk2.git] / PcAtChipsetPkg / Library / AcpiTimerLib / DxeAcpiTimerLib.c
index b141c68..67e18a1 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
@@ -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