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