public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Ni, Ray" <ray.ni@intel.com>
To: "Lou, Yun" <yun.lou@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Dong, Eric" <eric.dong@intel.com>,
	Laszlo Ersek <lersek@redhat.com>,
	"Kumar, Rahul1" <rahul1.kumar@intel.com>
Subject: Re: [PATCH v2] UefiCpuPkg: Remove PEI/DXE instances of CpuTimerLib.
Date: Thu, 8 Apr 2021 00:36:49 +0000	[thread overview]
Message-ID: <CO1PR11MB49307CB6AB425DDE7DA219DA8C749@CO1PR11MB4930.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20210407081625.14254-1-yun.lou@intel.com>

Thanks for providing the detailed commit messages.
Reviewed-by: Ray Ni <ray.ni@intel.com>


> -----Original Message-----
> From: Lou, Yun <yun.lou@intel.com>
> Sent: Wednesday, April 7, 2021 4:16 PM
> To: devel@edk2.groups.io
> Cc: Lou, Yun <yun.lou@intel.com>; Ni, Ray <ray.ni@intel.com>; Dong, Eric <eric.dong@intel.com>; Laszlo Ersek
> <lersek@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>
> Subject: [PATCH v2] UefiCpuPkg: Remove PEI/DXE instances of CpuTimerLib.
> 
> From: Jason Lou <yun.lou@intel.com>
> 
> 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
> frequency 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, this
> constructor function is called, it will take extra time to calculate TSC
> frequency.
> The time it takes to get TSC frequency 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 server platform and collected following data:
> 1. Average time required to find CpuCrystalFrequencyHob: about 2000 ns.
> 2. Average time required to find the last Hob: about 2700 ns.
> 2. Average time required to calculate TSC frequency: about 450 ns.
> 
> Reference code:
>     //
>     // Calculate average time required 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 required to find Hob = %d ns\n", \
>           DivU64x32(DivU64x64Remainder(MultU64x32((Ticks2 - Ticks1), 1000000000), *CpuCrystalCounterFrequency, NULL),
> 1000)));
>     }
> 
>     //
>     // Calculate average time required 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 required to calculate TSC frequency = %d ns\n", \
>         DivU64x32(DivU64x64Remainder(MultU64x32((Ticks2 - Ticks1), 1000000000), *CpuCrystalCounterFrequency, NULL), 1000)));
> 
> Signed-off-by: Jason Lou <yun.lou@intel.com>
> Cc: Ray Ni <ray.ni@intel.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Rahul Kumar <rahul1.kumar@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                         |  2 -
>  7 files changed, 252 deletions(-)
> 
> diff --git a/UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.c b/UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.c
> deleted file mode 100644
> index 269e5a3e83..0000000000
> --- 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 91a7212056..0000000000
> --- 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 6c83549c87..0000000000
> --- 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 f55b92abac..0000000000
> --- 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 7af0fc44a6..0000000000
> --- 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 49beb44908..0000000000
> --- 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 98c4c53465..c16cf8d1b9 100644
> --- a/UefiCpuPkg/UefiCpuPkg.dsc
> +++ b/UefiCpuPkg/UefiCpuPkg.dsc
> @@ -116,8 +116,6 @@
>    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
> 
>    UefiCpuPkg/Library/CpuCacheInfoLib/PeiCpuCacheInfoLib.inf
> 
>    UefiCpuPkg/Library/CpuCacheInfoLib/DxeCpuCacheInfoLib.inf
> 
> 
> 
> --
> 2.28.0.windows.1


  reply	other threads:[~2021-04-08  0:37 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-07  8:16 [PATCH v2] UefiCpuPkg: Remove PEI/DXE instances of CpuTimerLib Jason Lou
2021-04-08  0:36 ` Ni, Ray [this message]
     [not found] ` <1673BAF6BEAFB94F.26818@groups.io>
2021-04-09  0:45   ` [edk2-devel] " Ni, Ray
2021-04-09 13:43     ` Laszlo Ersek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CO1PR11MB49307CB6AB425DDE7DA219DA8C749@CO1PR11MB4930.namprd11.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox