]> git.proxmox.com Git - mirror_edk2.git/blobdiff - DuetPkg/Library/DuetTimerLib/X86TimerLib.c
DuetPkg: Remove DuetPkg
[mirror_edk2.git] / DuetPkg / Library / DuetTimerLib / X86TimerLib.c
diff --git a/DuetPkg/Library/DuetTimerLib/X86TimerLib.c b/DuetPkg/Library/DuetTimerLib/X86TimerLib.c
deleted file mode 100644 (file)
index ca3890c..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-/** @file\r
-  Timer Library functions built upon ACPI on IA32/x64.\r
-  \r
-  ACPI power management timer is a 24-bit or 32-bit fixed rate free running count-up\r
-  timer that runs off a 3.579545 MHz clock. \r
-  When startup, Duet will check the FADT to determine whether the PM timer is a \r
-  32-bit or 24-bit timer.\r
-\r
-  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include <Base.h>\r
-#include <Library/TimerLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/HobLib.h>\r
-#include <Guid/AcpiDescription.h>\r
-#include <Library/IoLib.h>\r
-#include <Library/PciLib.h>\r
-\r
-EFI_ACPI_DESCRIPTION *gAcpiDesc          = NULL;\r
-\r
-/**\r
-  Internal function to get Acpi information from HOB.\r
-  \r
-  @return Pointer to ACPI description structure.\r
-**/\r
-EFI_ACPI_DESCRIPTION*\r
-InternalGetApciDescrptionTable (\r
-  VOID\r
-  )\r
-{\r
-  EFI_PEI_HOB_POINTERS  GuidHob;\r
-  \r
-  if (gAcpiDesc != NULL) {\r
-    return gAcpiDesc;\r
-  }\r
-  \r
-  GuidHob.Raw = GetFirstGuidHob (&gEfiAcpiDescriptionGuid);\r
-  if (GuidHob.Raw != NULL) {\r
-    gAcpiDesc = GET_GUID_HOB_DATA (GuidHob.Guid);\r
-    DEBUG ((EFI_D_INFO, "ACPI Timer: PM_TMR_BLK.RegisterBitWidth = 0x%X\n", gAcpiDesc->PM_TMR_BLK.RegisterBitWidth));\r
-    DEBUG ((EFI_D_INFO, "ACPI Timer: PM_TMR_BLK.Address = 0x%X\n", gAcpiDesc->PM_TMR_BLK.Address));\r
-    return gAcpiDesc;\r
-  } else {\r
-    DEBUG ((EFI_D_ERROR, "Fail to get Acpi description table from hob\n"));\r
-    return NULL;\r
-  }\r
-}\r
-\r
-/**\r
-  Internal function to read the current tick counter of ACPI.\r
-\r
-  @return The tick counter read.\r
-\r
-**/\r
-STATIC\r
-UINT32\r
-InternalAcpiGetTimerTick (\r
-  VOID\r
-  )\r
-{\r
-  return IoRead32 ((UINTN)gAcpiDesc->PM_TMR_BLK.Address);\r
-}\r
-\r
-/**\r
-  Stalls the CPU for at least the given number of ticks.\r
-\r
-  Stalls the CPU for at least the given number of ticks. It's invoked by\r
-  MicroSecondDelay() and NanoSecondDelay().\r
-\r
-  @param  Delay     A period of time to delay in ticks.\r
-\r
-**/\r
-STATIC\r
-VOID\r
-InternalAcpiDelay (\r
-  IN      UINT32                    Delay\r
-  )\r
-{\r
-  UINT32                            Ticks;\r
-  UINT32                            Times;\r
-\r
-  Times    = Delay >> (gAcpiDesc->PM_TMR_BLK.RegisterBitWidth - 2);\r
-  Delay   &= (1 << (gAcpiDesc->PM_TMR_BLK.RegisterBitWidth - 2)) - 1;\r
-  do {\r
-    //\r
-    // The target timer count is calculated here\r
-    //\r
-    Ticks    = InternalAcpiGetTimerTick () + Delay;\r
-    Delay    = 1 << (gAcpiDesc->PM_TMR_BLK.RegisterBitWidth - 2);\r
-    //\r
-    // Wait until time out\r
-    // Delay >= 2^23 (if ACPI provide 24-bit timer) or Delay >= 2^31 (if ACPI\r
-    // provide 32-bit timer) could not be handled by this function\r
-    // Timer wrap-arounds are handled correctly by this function\r
-    //\r
-    while (((Ticks - InternalAcpiGetTimerTick ()) & (1 << (gAcpiDesc->PM_TMR_BLK.RegisterBitWidth - 1))) == 0) {\r
-      CpuPause ();\r
-    }\r
-  } while (Times-- > 0);\r
-}\r
-\r
-/**\r
-  Stalls the CPU for at least the given number of microseconds.\r
-\r
-  Stalls the CPU for the number of microseconds specified by MicroSeconds.\r
-\r
-  @param  MicroSeconds  The minimum number of microseconds to delay.\r
-\r
-  @return MicroSeconds\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-MicroSecondDelay (\r
-  IN      UINTN                     MicroSeconds\r
-  )\r
-{\r
-\r
-  if (InternalGetApciDescrptionTable() == NULL) {\r
-    return MicroSeconds;\r
-  }\r
\r
-  InternalAcpiDelay (\r
-    (UINT32)DivU64x32 (\r
-              MultU64x32 (\r
-                MicroSeconds,\r
-                3579545\r
-                ),\r
-              1000000u\r
-              )\r
-    );\r
-  return MicroSeconds;\r
-}\r
-\r
-/**\r
-  Stalls the CPU for at least the given number of nanoseconds.\r
-\r
-  Stalls the CPU for the number of nanoseconds specified by NanoSeconds.\r
-\r
-  @param  NanoSeconds The minimum number of nanoseconds to delay.\r
-\r
-  @return NanoSeconds\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-NanoSecondDelay (\r
-  IN      UINTN                     NanoSeconds\r
-  )\r
-{\r
-  if (InternalGetApciDescrptionTable() == NULL) {\r
-    return NanoSeconds;\r
-  }\r
-  \r
-  InternalAcpiDelay (\r
-    (UINT32)DivU64x32 (\r
-              MultU64x32 (\r
-                NanoSeconds,\r
-                3579545\r
-                ),\r
-              1000000000u\r
-              )\r
-    );\r
-  return NanoSeconds;\r
-}\r
-\r
-/**\r
-  Retrieves the current value of a 64-bit free running performance counter.\r
-\r
-  Retrieves the current value of a 64-bit free running performance counter. The\r
-  counter can either count up by 1 or count down by 1. If the physical\r
-  performance counter counts by a larger increment, then the counter values\r
-  must be translated. The properties of the counter can be retrieved from\r
-  GetPerformanceCounterProperties().\r
-\r
-  @return The current value of the free running performance counter.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-GetPerformanceCounter (\r
-  VOID\r
-  )\r
-{\r
-  if (InternalGetApciDescrptionTable() == NULL) {\r
-    return 0;\r
-  }\r
-  \r
-  return (UINT64)InternalAcpiGetTimerTick ();\r
-}\r
-\r
-/**\r
-  Retrieves the 64-bit frequency in Hz and the range of performance counter\r
-  values.\r
-\r
-  If StartValue is not NULL, then the value that the performance counter starts\r
-  with immediately after is it rolls over is returned in StartValue. If\r
-  EndValue is not NULL, then the value that the performance counter end with\r
-  immediately before it rolls over is returned in EndValue. The 64-bit\r
-  frequency of the performance counter in Hz is always returned. If StartValue\r
-  is less than EndValue, then the performance counter counts up. If StartValue\r
-  is greater than EndValue, then the performance counter counts down. For\r
-  example, a 64-bit free running counter that counts up would have a StartValue\r
-  of 0 and an EndValue of 0xFFFFFFFFFFFFFFFF. A 24-bit free running counter\r
-  that counts down would have a StartValue of 0xFFFFFF and an EndValue of 0.\r
-\r
-  @param  StartValue  The value the performance counter starts with when it\r
-                      rolls over.\r
-  @param  EndValue    The value that the performance counter ends with before\r
-                      it rolls over.\r
-\r
-  @return The frequency in Hz.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-GetPerformanceCounterProperties (\r
-  OUT      UINT64                    *StartValue,  OPTIONAL\r
-  OUT      UINT64                    *EndValue     OPTIONAL\r
-  )\r
-{\r
-  if (InternalGetApciDescrptionTable() == NULL) {\r
-    return 0;\r
-  }\r
-  \r
-  if (StartValue != NULL) {\r
-    *StartValue = 0;\r
-  }\r
-\r
-  if (EndValue != NULL) {\r
-    *EndValue = (1 << gAcpiDesc->PM_TMR_BLK.RegisterBitWidth) - 1;\r
-  }\r
-\r
-  return 3579545;\r
-}\r
-\r
-/**\r
-  Converts elapsed ticks of performance counter to time in nanoseconds.\r
-\r
-  This function converts the elapsed ticks of running performance counter to\r
-  time value in unit of nanoseconds.\r
-\r
-  @param  Ticks     The number of elapsed ticks of running performance counter.\r
-\r
-  @return The elapsed time in nanoseconds.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-GetTimeInNanoSecond (\r
-  IN      UINT64                     Ticks\r
-  )\r
-{\r
-  UINT64  NanoSeconds;\r
-  UINT32  Remainder;\r
-\r
-  //\r
-  //          Ticks\r
-  // Time = --------- x 1,000,000,000\r
-  //        Frequency\r
-  //\r
-  NanoSeconds = MultU64x32 (DivU64x32Remainder (Ticks, 3579545, &Remainder), 1000000000u);\r
-\r
-  //\r
-  // Frequency < 0x100000000, so Remainder < 0x100000000, then (Remainder * 1,000,000,000)\r
-  // will not overflow 64-bit.\r
-  //\r
-  NanoSeconds += DivU64x32 (MultU64x32 ((UINT64) Remainder, 1000000000u), 3579545);\r
-\r
-  return NanoSeconds;\r
-}\r