]> git.proxmox.com Git - mirror_edk2.git/blobdiff - PcAtChipsetPkg/Library/AcpiTimerLib/DxeStandaloneMmAcpiTimerLib.c
PcAtChipsetPkg: AcpiTimerLib: Added StandaloneMm instance of AcpiTimerLib
[mirror_edk2.git] / PcAtChipsetPkg / Library / AcpiTimerLib / DxeStandaloneMmAcpiTimerLib.c
diff --git a/PcAtChipsetPkg/Library/AcpiTimerLib/DxeStandaloneMmAcpiTimerLib.c b/PcAtChipsetPkg/Library/AcpiTimerLib/DxeStandaloneMmAcpiTimerLib.c
new file mode 100644 (file)
index 0000000..0e40119
--- /dev/null
@@ -0,0 +1,101 @@
+/** @file\r
+  ACPI Timer implements one instance of Timer Library.\r
+\r
+  Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\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 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
+**/\r
+UINT64\r
+InternalCalculateTscFrequency (\r
+  VOID\r
+  );\r
+\r
+//\r
+// Cached performance counter frequency\r
+//\r
+UINT64  mPerformanceCounterFrequency = 0;\r
+\r
+/**\r
+  Internal function to retrieves the 64-bit frequency in Hz.\r
+\r
+  Internal function to retrieves the 64-bit frequency in Hz.\r
+\r
+  @return The frequency in Hz.\r
+\r
+**/\r
+UINT64\r
+InternalGetPerformanceCounterFrequency (\r
+  VOID\r
+  )\r
+{\r
+  return  mPerformanceCounterFrequency;\r
+}\r
+\r
+/**\r
+  The constructor function enables ACPI IO space, and caches PerformanceCounterFrequency.\r
+\r
+  @retval EFI_SUCCESS   The constructor always returns RETURN_SUCCESS.\r
+\r
+**/\r
+EFI_STATUS\r
+CommonAcpiTimerLibConstructor (\r
+  VOID\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
+\r
+  return EFI_SUCCESS;\r
+}\r