Reviewed-by: Ray Ni <ray...@intel.com>

> -----Original Message-----
> From: Lou, Yun <yun....@intel.com>
> Sent: Friday, September 25, 2020 11:58 AM
> To: devel@edk2.groups.io
> Cc: Lou, Yun <yun....@intel.com>; Ni, Ray <ray...@intel.com>; Dong, Eric 
> <eric.d...@intel.com>; Laszlo Ersek
> <ler...@redhat.com>; Kumar, Rahul1 <rahul1.ku...@intel.com>
> Subject: [PATCH v1 1/1] UefiCpuPkg: Remove PEI/DXE instances of CpuTimerLib.
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2832
> 
> 1. Remove PEI instance(PeiCpuTimerLib).
> PeiCpuTimerLib is currently designed to save time by getting CPU TSC frequncy 
> from Hob.
> BaseCpuTimerLib is designed to calculate TSC frequency by using CPUID[15h] 
> each time.
> The time it takes to find CpuCrystalFrequencyHob (about 2000ns) is much 
> longer than it takes to
> calculate TSC frequency with CPUID[15h] (about 450ns), which means using 
> BaseCpuTimerLib to
> trigger a delay is more accurate than using PeiCpuTimerLib, recommend to use 
> BaseCpuTimerLib
> instead of PeiCpuTimerLib.
> 
> 2. Remove DXE instance(DxeCpuTimerLib).
> DxeCpuTimerLib is designed to calculate TSC frequency with CPUID[15h] in its 
> constructor function,
> then save it in a global variable. For this design, once the driver 
> containing this instance is
> running, the constructor function is called, it will take extra time to 
> calculate TSC frequency.
> The time it takes to get TSC frequncy from global variable is shorter than it 
> takes to calculate
> TSC frequency with CPUID[15h], but 450ns is a short time, the impact on the 
> platform is very limited.
> In addition, in order to simplify the code, recommend to use BaseCpuTimerLib 
> instead of DxeCpuTimerLib.
> 
> I did some experiments on one Intel server platform and collected the 
> following data:
> 1. Average time taken to find CpuCrystalFrequencyHob: about 2000 ns.
> 2. Average time taken to calculate TSC frequency: about 450 ns.
> 
> Reference code:
>     //
>     // Calculate average time taken to find Hob.
>     //
>     DEBUG((DEBUG_ERROR, "[PeiCpuTimerLib] GetPerformanceCounterFrequency - 
> GetFirstGuidHob (1000 cycles)\n"));
>     Ticks1 = AsmReadTsc();
>     for (i = 0; i < 1000; i++) {
>       GuidHob = GetFirstGuidHob (&mCpuCrystalFrequencyHobGuid);
>     }
>     Ticks2 = AsmReadTsc();
> 
>     if (GuidHob == NULL) {
>       DEBUG((DEBUG_ERROR, "[PeiCpuTimerLib]  - CpuCrystalFrequencyHob can not 
> be found!\n"));
>     } else {
>       DEBUG((DEBUG_ERROR, "[PeiCpuTimerLib]  - Average time taken to find Hob 
> = %d ns\n", \
>           DivU64x32(DivU64x64Remainder(MultU64x32((Ticks2 - Ticks1), 
> 1000000000), *CpuCrystalCounterFrequency, NULL),
> 1000)));
>     }
> 
>     //
>     // Calculate average time taken to calculate CPU frequency.
>     //
>     DEBUG((DEBUG_ERROR, "[PeiCpuTimerLib] GetPerformanceCounterFrequency - 
> CpuidCoreClockCalculateTscFrequency
> (1000 cycles)\n"));
>     Ticks1 = AsmReadTsc();
>     for (i = 0; i < 1000; i++) {
>       Freq = CpuidCoreClockCalculateTscFrequency ();
>     }
>     Ticks2 = AsmReadTsc();
>     DEBUG((DEBUG_ERROR, "[PeiCpuTimerLib]  - Average time taken to calculate 
> TSC frequency = %d ns\n", \
>         DivU64x32(DivU64x64Remainder(MultU64x32((Ticks2 - Ticks1), 
> 1000000000), *CpuCrystalCounterFrequency, NULL),
> 1000)));
> 
> Signed-off-by: Jason Lou <yun....@intel.com>
> Cc: Ray Ni <ray...@intel.com>
> Cc: Eric Dong <eric.d...@intel.com>
> Cc: Laszlo Ersek <ler...@redhat.com>
> Cc: Rahul Kumar <rahul1.ku...@intel.com>
> ---
>  UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.c   | 85 --------------------
>  UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.c   | 58 -------------
>  UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.inf | 37 ---------
>  UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.uni | 17 ----
>  UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.inf | 36 ---------
>  UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.uni | 17 ----
>  UefiCpuPkg/UefiCpuPkg.dsc                         |  4 +-
>  7 files changed, 1 insertion(+), 253 deletions(-)
> 
> diff --git a/UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.c 
> b/UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.c
> deleted file mode 100644
> index 269e5a3e83d7..000000000000
> --- a/UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.c
> +++ /dev/null
> @@ -1,85 +0,0 @@
> -/** @file
> 
> -  CPUID Leaf 0x15 for Core Crystal Clock frequency instance of Timer Library.
> 
> -
> 
> -  Copyright (c) 2019 Intel Corporation. All rights reserved.<BR>
> 
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> -
> 
> -**/
> 
> -
> 
> -#include <PiDxe.h>
> 
> -#include <Library/TimerLib.h>
> 
> -#include <Library/BaseLib.h>
> 
> -#include <Library/HobLib.h>
> 
> -
> 
> -extern GUID mCpuCrystalFrequencyHobGuid;
> 
> -
> 
> -/**
> 
> -  CPUID Leaf 0x15 for Core Crystal Clock Frequency.
> 
> -
> 
> -  The TSC counting frequency is determined by using CPUID leaf 0x15. 
> Frequency in MHz = Core XTAL frequency * EBX/EAX.
> 
> -  In newer flavors of the CPU, core xtal frequency is returned in ECX or 0 
> if not supported.
> 
> -  @return The number of TSC counts per second.
> 
> -
> 
> -**/
> 
> -UINT64
> 
> -CpuidCoreClockCalculateTscFrequency (
> 
> -  VOID
> 
> -  );
> 
> -
> 
> -//
> 
> -// Cached CPU Crystal counter frequency
> 
> -//
> 
> -UINT64  mCpuCrystalCounterFrequency = 0;
> 
> -
> 
> -
> 
> -/**
> 
> -  Internal function to retrieves the 64-bit frequency in Hz.
> 
> -
> 
> -  Internal function to retrieves the 64-bit frequency in Hz.
> 
> -
> 
> -  @return The frequency in Hz.
> 
> -
> 
> -**/
> 
> -UINT64
> 
> -InternalGetPerformanceCounterFrequency (
> 
> -  VOID
> 
> -  )
> 
> -{
> 
> -  return mCpuCrystalCounterFrequency;
> 
> -}
> 
> -
> 
> -/**
> 
> -  The constructor function is to initialize CpuCrystalCounterFrequency.
> 
> -
> 
> -  @param  ImageHandle   The firmware allocated handle for the EFI image.
> 
> -  @param  SystemTable   A pointer to the EFI System Table.
> 
> -
> 
> -  @retval EFI_SUCCESS   The constructor always returns RETURN_SUCCESS.
> 
> -
> 
> -**/
> 
> -EFI_STATUS
> 
> -EFIAPI
> 
> -DxeCpuTimerLibConstructor (
> 
> -  IN EFI_HANDLE        ImageHandle,
> 
> -  IN EFI_SYSTEM_TABLE  *SystemTable
> 
> -  )
> 
> -{
> 
> -  EFI_HOB_GUID_TYPE   *GuidHob;
> 
> -
> 
> -  //
> 
> -  // Initialize CpuCrystalCounterFrequency
> 
> -  //
> 
> -  GuidHob = GetFirstGuidHob (&mCpuCrystalFrequencyHobGuid);
> 
> -  if (GuidHob != NULL) {
> 
> -    mCpuCrystalCounterFrequency = *(UINT64*)GET_GUID_HOB_DATA (GuidHob);
> 
> -  } else {
> 
> -    mCpuCrystalCounterFrequency = CpuidCoreClockCalculateTscFrequency ();
> 
> -  }
> 
> -
> 
> -  if (mCpuCrystalCounterFrequency == 0) {
> 
> -    return EFI_UNSUPPORTED;
> 
> -  }
> 
> -
> 
> -  return EFI_SUCCESS;
> 
> -}
> 
> -
> 
> diff --git a/UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.c 
> b/UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.c
> deleted file mode 100644
> index 91a721205653..000000000000
> --- a/UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.c
> +++ /dev/null
> @@ -1,58 +0,0 @@
> -/** @file
> 
> -  CPUID Leaf 0x15 for Core Crystal Clock frequency instance as PEI Timer 
> Library.
> 
> -
> 
> -  Copyright (c) 2019 Intel Corporation. All rights reserved.<BR>
> 
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> -
> 
> -**/
> 
> -
> 
> -#include <PiPei.h>
> 
> -#include <Library/TimerLib.h>
> 
> -#include <Library/BaseLib.h>
> 
> -#include <Library/HobLib.h>
> 
> -#include <Library/DebugLib.h>
> 
> -
> 
> -extern GUID mCpuCrystalFrequencyHobGuid;
> 
> -
> 
> -/**
> 
> -  CPUID Leaf 0x15 for Core Crystal Clock Frequency.
> 
> -
> 
> -  The TSC counting frequency is determined by using CPUID leaf 0x15. 
> Frequency in MHz = Core XTAL frequency * EBX/EAX.
> 
> -  In newer flavors of the CPU, core xtal frequency is returned in ECX or 0 
> if not supported.
> 
> -  @return The number of TSC counts per second.
> 
> -
> 
> -**/
> 
> -UINT64
> 
> -CpuidCoreClockCalculateTscFrequency (
> 
> -  VOID
> 
> -  );
> 
> -
> 
> -/**
> 
> -  Internal function to retrieves the 64-bit frequency in Hz.
> 
> -
> 
> -  Internal function to retrieves the 64-bit frequency in Hz.
> 
> -
> 
> -  @return The frequency in Hz.
> 
> -
> 
> -**/
> 
> -UINT64
> 
> -InternalGetPerformanceCounterFrequency (
> 
> -  VOID
> 
> -  )
> 
> -{
> 
> -  UINT64              *CpuCrystalCounterFrequency;
> 
> -  EFI_HOB_GUID_TYPE   *GuidHob;
> 
> -
> 
> -  CpuCrystalCounterFrequency = NULL;
> 
> -  GuidHob = GetFirstGuidHob (&mCpuCrystalFrequencyHobGuid);
> 
> -  if (GuidHob == NULL) {
> 
> -    CpuCrystalCounterFrequency  = 
> (UINT64*)BuildGuidHob(&mCpuCrystalFrequencyHobGuid, sizeof
> (*CpuCrystalCounterFrequency));
> 
> -    ASSERT (CpuCrystalCounterFrequency != NULL);
> 
> -    *CpuCrystalCounterFrequency = CpuidCoreClockCalculateTscFrequency ();
> 
> -  } else {
> 
> -    CpuCrystalCounterFrequency = (UINT64*)GET_GUID_HOB_DATA (GuidHob);
> 
> -  }
> 
> -
> 
> -  return  *CpuCrystalCounterFrequency;
> 
> -}
> 
> -
> 
> diff --git a/UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.inf 
> b/UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.inf
> deleted file mode 100644
> index 6c83549c87da..000000000000
> --- a/UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.inf
> +++ /dev/null
> @@ -1,37 +0,0 @@
> -## @file
> 
> -#  DXE CPU Timer Library
> 
> -#
> 
> -#  Provides basic timer support using CPUID Leaf 0x15 XTAL frequency. The 
> performance
> 
> -#  counter features are provided by the processors time stamp counter.
> 
> -#
> 
> -#  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> 
> -#  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> -#
> 
> -##
> 
> -
> 
> -[Defines]
> 
> -  INF_VERSION                    = 0x00010005
> 
> -  BASE_NAME                      = DxeCpuTimerLib
> 
> -  FILE_GUID                      = F22CC0DA-E7DB-4E4D-ABE2-A608188233A2
> 
> -  MODULE_TYPE                    = DXE_DRIVER
> 
> -  VERSION_STRING                 = 1.0
> 
> -  LIBRARY_CLASS                  = TimerLib|DXE_CORE DXE_DRIVER 
> DXE_RUNTIME_DRIVER DXE_SMM_DRIVER
> UEFI_APPLICATION UEFI_DRIVER SMM_CORE
> 
> -  CONSTRUCTOR                    = DxeCpuTimerLibConstructor
> 
> -  MODULE_UNI_FILE                = DxeCpuTimerLib.uni
> 
> -
> 
> -[Sources]
> 
> -  CpuTimerLib.c
> 
> -  DxeCpuTimerLib.c
> 
> -
> 
> -[Packages]
> 
> -  MdePkg/MdePkg.dec
> 
> -  UefiCpuPkg/UefiCpuPkg.dec
> 
> -
> 
> -[LibraryClasses]
> 
> -  BaseLib
> 
> -  PcdLib
> 
> -  DebugLib
> 
> -  HobLib
> 
> -
> 
> -[Pcd]
> 
> -  gUefiCpuPkgTokenSpaceGuid.PcdCpuCoreCrystalClockFrequency  ## CONSUMES
> 
> diff --git a/UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.uni 
> b/UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.uni
> deleted file mode 100644
> index f55b92abace7..000000000000
> --- a/UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.uni
> +++ /dev/null
> @@ -1,17 +0,0 @@
> -// /** @file
> 
> -// DXE CPU Timer Library
> 
> -//
> 
> -// Provides basic timer support using CPUID Leaf 0x15 XTAL frequency.  The 
> performance
> 
> -// counter features are provided by the processors time stamp counter.
> 
> -//
> 
> -// Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> 
> -//
> 
> -// SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> -//
> 
> -// **/
> 
> -
> 
> -
> 
> -#string STR_MODULE_ABSTRACT             #language en-US "CPU Timer Library"
> 
> -
> 
> -#string STR_MODULE_DESCRIPTION          #language en-US "Provides basic 
> timer support using CPUID Leaf 0x15 XTAL
> frequency."
> 
> -
> 
> diff --git a/UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.inf 
> b/UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.inf
> deleted file mode 100644
> index 7af0fc44a65d..000000000000
> --- a/UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.inf
> +++ /dev/null
> @@ -1,36 +0,0 @@
> -## @file
> 
> -#  PEI CPU Timer Library
> 
> -#
> 
> -#  Provides basic timer support using CPUID Leaf 0x15 XTAL frequency. The 
> performance
> 
> -#  counter features are provided by the processors time stamp counter.
> 
> -#
> 
> -#  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> 
> -#  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> -#
> 
> -##
> 
> -
> 
> -[Defines]
> 
> -  INF_VERSION                    = 0x00010005
> 
> -  BASE_NAME                      = PeiCpuTimerLib
> 
> -  FILE_GUID                      = 2B13DE00-1A5F-4DD7-A298-01B08AF1015A
> 
> -  MODULE_TYPE                    = BASE
> 
> -  VERSION_STRING                 = 1.0
> 
> -  LIBRARY_CLASS                  = TimerLib|PEI_CORE PEIM
> 
> -  MODULE_UNI_FILE                = PeiCpuTimerLib.uni
> 
> -
> 
> -[Sources]
> 
> -  CpuTimerLib.c
> 
> -  PeiCpuTimerLib.c
> 
> -
> 
> -[Packages]
> 
> -  MdePkg/MdePkg.dec
> 
> -  UefiCpuPkg/UefiCpuPkg.dec
> 
> -
> 
> -[LibraryClasses]
> 
> -  BaseLib
> 
> -  PcdLib
> 
> -  DebugLib
> 
> -  HobLib
> 
> -
> 
> -[Pcd]
> 
> -  gUefiCpuPkgTokenSpaceGuid.PcdCpuCoreCrystalClockFrequency  ## CONSUMES
> 
> diff --git a/UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.uni 
> b/UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.uni
> deleted file mode 100644
> index 49beb44908d6..000000000000
> --- a/UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.uni
> +++ /dev/null
> @@ -1,17 +0,0 @@
> -// /** @file
> 
> -// PEI CPU Timer Library
> 
> -//
> 
> -// Provides basic timer support using CPUID Leaf 0x15 XTAL frequency.  The 
> performance
> 
> -// counter features are provided by the processors time stamp counter.
> 
> -//
> 
> -// Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> 
> -//
> 
> -// SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> -//
> 
> -// **/
> 
> -
> 
> -
> 
> -#string STR_MODULE_ABSTRACT             #language en-US "CPU Timer Library"
> 
> -
> 
> -#string STR_MODULE_DESCRIPTION          #language en-US "Provides basic 
> timer support using CPUID Leaf 0x15 XTAL
> frequency."
> 
> -
> 
> diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc
> index b2b6d78a71b0..e915b5c81b66 100644
> --- a/UefiCpuPkg/UefiCpuPkg.dsc
> +++ b/UefiCpuPkg/UefiCpuPkg.dsc
> @@ -1,7 +1,7 @@
>  ## @file
> 
>  #  UefiCpuPkg Package
> 
>  #
> 
> -#  Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
> 
> +#  Copyright (c) 2007 - 2020, Intel Corporation. All rights reserved.<BR>
> 
>  #
> 
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  #
> 
> @@ -107,8 +107,6 @@ [Components]
>    UefiCpuPkg/Library/SecPeiDxeTimerLibUefiCpu/SecPeiDxeTimerLibUefiCpu.inf
> 
>    UefiCpuPkg/Application/Cpuid/Cpuid.inf
> 
>    UefiCpuPkg/Library/CpuTimerLib/BaseCpuTimerLib.inf
> 
> -  UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.inf
> 
> -  UefiCpuPkg/Library/CpuTimerLib/PeiCpuTimerLib.inf
> 
> 
> 
>  [Components.IA32, Components.X64]
> 
>    UefiCpuPkg/CpuDxe/CpuDxe.inf
> 
> --
> 2.28.0.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#65606): https://edk2.groups.io/g/devel/message/65606
Mute This Topic: https://groups.io/mt/77073830/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to