\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
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