]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/DxeTimerLibEsal/DxeTimerLibEsal.c
MdePkg: Clean up source files
[mirror_edk2.git] / MdePkg / Library / DxeTimerLibEsal / DxeTimerLibEsal.c
index 964f814bb22fbba30e009742c6229d19c6a7ceed..460ff42679dcac303e75eac34a1ce093b054437d 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   This library implements the Timer Library using the Extended SAL Stall Services Class.\r
 \r
-  Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2007 - 2018, 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
@@ -42,13 +42,13 @@ MicroSecondDelay (
   EsalCall (\r
     EFI_EXTENDED_SAL_STALL_SERVICES_PROTOCOL_GUID_LO,\r
     EFI_EXTENDED_SAL_STALL_SERVICES_PROTOCOL_GUID_HI,\r
-    StallFunctionId, \r
-    MicroSeconds, \r
-    0, \r
-    0, \r
-    0, \r
-    0, \r
-    0, \r
+    StallFunctionId,\r
+    MicroSeconds,\r
+    0,\r
+    0,\r
+    0,\r
+    0,\r
+    0,\r
     0\r
     );\r
   return MicroSeconds;\r
@@ -82,13 +82,13 @@ NanoSecondDelay (
   EsalCall (\r
     EFI_EXTENDED_SAL_STALL_SERVICES_PROTOCOL_GUID_LO,\r
     EFI_EXTENDED_SAL_STALL_SERVICES_PROTOCOL_GUID_HI,\r
-    StallFunctionId, \r
-    MicroSeconds, \r
-    0, \r
-    0, \r
-    0, \r
-    0, \r
-    0, \r
+    StallFunctionId,\r
+    MicroSeconds,\r
+    0,\r
+    0,\r
+    0,\r
+    0,\r
+    0,\r
     0\r
     );\r
   return NanoSeconds;\r
@@ -177,3 +177,47 @@ GetPerformanceCounterProperties (
 \r
   return BaseFrequence * (PalRet.r11 >> 32) / (UINT32)PalRet.r11;\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  Frequency;\r
+  UINT64  NanoSeconds;\r
+  UINT64  Remainder;\r
+  INTN    Shift;\r
+\r
+  Frequency = GetPerformanceCounterProperties (NULL, NULL);\r
+\r
+  //\r
+  //          Ticks\r
+  // Time = --------- x 1,000,000,000\r
+  //        Frequency\r
+  //\r
+  NanoSeconds = MultU64x32 (DivU64x64Remainder (Ticks, Frequency, &Remainder), 1000000000u);\r
+\r
+  //\r
+  // Ensure (Remainder * 1,000,000,000) will not overflow 64-bit.\r
+  // Since 2^29 < 1,000,000,000 = 0x3B9ACA00 < 2^30, Remainder should < 2^(64-30) = 2^34,\r
+  // i.e. highest bit set in Remainder should <= 33.\r
+  //\r
+  Shift = MAX (0, HighBitSet64 (Remainder) - 33);\r
+  Remainder = RShiftU64 (Remainder, (UINTN) Shift);\r
+  Frequency = RShiftU64 (Frequency, (UINTN) Shift);\r
+  NanoSeconds += DivU64x64Remainder (MultU64x32 (Remainder, 1000000000u), Frequency, NULL);\r
+\r
+  return NanoSeconds;\r
+}\r