public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Chao Li" <lichao@loongson.cn>
To: devel@edk2.groups.io, Ray Ni <ray.ni@intel.com>
Cc: Eric Dong <eric.dong@intel.com>,
	Rahul Kumar <rahul1.kumar@intel.com>,
	Gerd Hoffmann <kraxel@redhat.com>
Subject: Re: [edk2-devel] [PATCH v8 11/37] UefiCpuPkg: Add LoongArch64 CPU Timer instance
Date: Wed, 31 Jan 2024 11:30:52 +0800	[thread overview]
Message-ID: <bdf49ce9-2fd6-4b22-ae25-dde6d449c7c5@loongson.cn> (raw)
In-Reply-To: <17ADD1D5A196C454.24595@groups.io>

[-- Attachment #1: Type: text/plain, Size: 9815 bytes --]

Hi Ray,

Can you please help to review this patch again?


Thanks,
Chao
On 2024/1/26 14:29, Chao Li wrote:
> Add the LoongArch64 CPU Timer instance to CpuTimerLib, using CPUCFG 0x4
> and 0x5 for Stable Counter frequency.
>
> BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=4584
>
> Cc: Eric Dong<eric.dong@intel.com>
> Cc: Ray Ni<ray.ni@intel.com>
> Cc: Rahul Kumar<rahul1.kumar@intel.com>
> Cc: Gerd Hoffmann<kraxel@redhat.com>
> Signed-off-by: Chao Li<lichao@loongson.cn>
> ---
>   .../Library/CpuTimerLib/BaseCpuTimerLib.inf   |   9 +-
>   .../CpuTimerLib/LoongArch64/CpuTimerLib.c     | 251 ++++++++++++++++++
>   2 files changed, 258 insertions(+), 2 deletions(-)
>   create mode 100644 UefiCpuPkg/Library/CpuTimerLib/LoongArch64/CpuTimerLib.c
>
> diff --git a/UefiCpuPkg/Library/CpuTimerLib/BaseCpuTimerLib.inf b/UefiCpuPkg/Library/CpuTimerLib/BaseCpuTimerLib.inf
> index de0648de91..7e6152ef7e 100644
> --- a/UefiCpuPkg/Library/CpuTimerLib/BaseCpuTimerLib.inf
> +++ b/UefiCpuPkg/Library/CpuTimerLib/BaseCpuTimerLib.inf
> @@ -5,6 +5,7 @@
>   #  counter features are provided by the processors time stamp counter.
>   #
>   #  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2024, Loongson Technology Corporation Limited. All rights reserved.<BR>
>   #  SPDX-License-Identifier: BSD-2-Clause-Patent
>   #
>   ##
> @@ -18,18 +19,22 @@
>     LIBRARY_CLASS                  = TimerLib
>     MODULE_UNI_FILE                = BaseCpuTimerLib.uni
>   
> -[Sources]
> +[Sources.IA32, Sources.X64]
>     CpuTimerLib.c
>     BaseCpuTimerLib.c
>   
> +[Sources.LOONGARCH64]
> +  LoongArch64/CpuTimerLib.c
> +
>   [Packages]
>     MdePkg/MdePkg.dec
>     UefiCpuPkg/UefiCpuPkg.dec
>   
>   [LibraryClasses]
>     BaseLib
> -  PcdLib
>     DebugLib
> +  PcdLib
> +  SafeIntLib
>   
>   [Pcd]
>     gUefiCpuPkgTokenSpaceGuid.PcdCpuCoreCrystalClockFrequency  ## CONSUMES
> diff --git a/UefiCpuPkg/Library/CpuTimerLib/LoongArch64/CpuTimerLib.c b/UefiCpuPkg/Library/CpuTimerLib/LoongArch64/CpuTimerLib.c
> new file mode 100644
> index 0000000000..a5ae8d0185
> --- /dev/null
> +++ b/UefiCpuPkg/Library/CpuTimerLib/LoongArch64/CpuTimerLib.c
> @@ -0,0 +1,251 @@
> +/** @file
> +  CPUCFG 0x4 and 0x5 for Stable Counter frequency instance of Timer Library.
> +
> +  Copyright (c) 2024, Loongson Technology Corporation Limited. All rights reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <Base.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/SafeIntLib.h>
> +#include <Library/TimerLib.h>
> +#include <Register/LoongArch64/Cpucfg.h>
> +
> +/**
> +  Calculate clock frequency using CPUCFG 0x4 and 0x5 registers.
> +
> +  @param  VOID.
> +
> +  @return The frequency in Hz.
> +
> +**/
> +STATIC
> +UINT64
> +CalcConstFreq (
> +  VOID
> +  )
> +{
> +  UINT32                 BaseFreq;
> +  UINT64                 ClockMultiplier;
> +  UINT32                 ClockDivide;
> +  CPUCFG_REG4_INFO_DATA  CcFreq;
> +  CPUCFG_REG5_INFO_DATA  CpucfgReg5Data;
> +  UINT64                 StableTimerFreq;
> +
> +  //
> +  // Get the the crystal frequency corresponding to the constant
> +  // frequency timer and the clock used by the timer.
> +  //
> +  AsmCpucfg (CPUCFG_REG4_INFO, &CcFreq.Uint32);
> +
> +  //
> +  // Get the multiplication factor and frequency division factor
> +  // corresponding to the constant frequency timer and the clock
> +  // used by the timer.
> +  //
> +  AsmCpucfg (CPUCFG_REG5_INFO, &CpucfgReg5Data.Uint32);
> +
> +  BaseFreq        = CcFreq.Bits.CC_FREQ;
> +  ClockMultiplier = CpucfgReg5Data.Bits.CC_MUL & 0xFFFF;
> +  ClockDivide     = CpucfgReg5Data.Bits.CC_DIV & 0xFFFF;
> +
> +  if ((BaseFreq == 0x0) || (ClockMultiplier == 0x0) || (ClockDivide == 0x0)) {
> +    DEBUG ((
> +      DEBUG_ERROR,
> +      "LoongArch Stable Timer is not available in the CPU, hence this library cannot be used.\n"
> +      ));
> +    ASSERT (FALSE);
> +    CpuDeadLoop ();
> +  }
> +
> +  StableTimerFreq = ((ClockMultiplier * BaseFreq) / ClockDivide);
> +
> +  if (StableTimerFreq == 0x0) {
> +    ASSERT (FALSE);
> +  }
> +
> +  return StableTimerFreq;
> +}
> +
> +/**
> +  Stalls the CPU for at least the given number of microseconds.
> +
> +  Stalls the CPU for the number of microseconds specified by MicroSeconds.
> +
> +  @param  MicroSeconds  The minimum number of microseconds to delay.
> +
> +  @return MicroSeconds
> +
> +**/
> +UINTN
> +EFIAPI
> +MicroSecondDelay (
> +  IN UINTN  MicroSeconds
> +  )
> +{
> +  UINT64         CurrentTicks, ExceptedTicks, Remaining;
> +  RETURN_STATUS  Status;
> +
> +  Status = SafeUint64Mult (MicroSeconds, CalcConstFreq (), &Remaining);
> +  ASSERT_RETURN_ERROR (Status);
> +
> +  ExceptedTicks  = DivU64x32 (Remaining, 1000000U);
> +  CurrentTicks   = AsmReadStableCounter ();
> +  ExceptedTicks += CurrentTicks;
> +
> +  do {
> +    CurrentTicks = AsmReadStableCounter ();
> +  } while (CurrentTicks < ExceptedTicks);
> +
> +  return MicroSeconds;
> +}
> +
> +/**
> +  Stalls the CPU for at least the given number of nanoseconds.
> +
> +  Stalls the CPU for the number of nanoseconds specified by NanoSeconds.
> +
> +  @param  NanoSeconds The minimum number of nanoseconds to delay.
> +
> +  @return NanoSeconds
> +
> +**/
> +UINTN
> +EFIAPI
> +NanoSecondDelay (
> +  IN UINTN  NanoSeconds
> +  )
> +{
> +  UINTN  MicroSeconds;
> +
> +  // Round up to 1us Tick Number
> +  MicroSeconds  = NanoSeconds / 1000;
> +  MicroSeconds += ((NanoSeconds % 1000) == 0) ? 0 : 1;
> +
> +  MicroSecondDelay (MicroSeconds);
> +
> +  return NanoSeconds;
> +}
> +
> +/**
> +  Retrieves the current value of a 64-bit free running Stable Counter.
> +
> +  The LoongArch defines a constant frequency timer, whose main body is a
> +  64-bit counter called StableCounter. StableCounter is set to 0 after
> +  reset, and then increments by 1 every counting clock cycle. When the
> +  count reaches all 1s, it automatically wraps around to 0 and continues
> +  to increment.
> +  The properties of the Stable Counter can be retrieved from
> +  GetPerformanceCounterProperties().
> +
> +  @return The current value of the Stable Counter.
> +
> +**/
> +UINT64
> +EFIAPI
> +GetPerformanceCounter (
> +  VOID
> +  )
> +{
> +  //
> +  // Just return the value of Stable Counter.
> +  //
> +  return AsmReadStableCounter ();
> +}
> +
> +/**
> +  Retrieves the 64-bit frequency in Hz and the range of Stable Counter
> +  values.
> +
> +  If StartValue is not NULL, then the value that the stbale counter starts
> +  with immediately after is it rolls over is returned in StartValue. If
> +  EndValue is not NULL, then the value that the stable counter end with
> +  immediately before it rolls over is returned in EndValue. The 64-bit
> +  frequency of the system frequency in Hz is always returned.
> +
> +  @param  StartValue  The value the stable counter starts with when it
> +                      rolls over.
> +  @param  EndValue    The value that the stable counter ends with before
> +                      it rolls over.
> +
> +  @return The frequency in Hz.
> +
> +**/
> +UINT64
> +EFIAPI
> +GetPerformanceCounterProperties (
> +  OUT UINT64  *StartValue   OPTIONAL,
> +  OUT UINT64  *EndValue     OPTIONAL
> +  )
> +{
> +  if (StartValue != NULL) {
> +    *StartValue = 0;
> +  }
> +
> +  if (EndValue != NULL) {
> +    *EndValue = 0xFFFFFFFFFFFFFFFFULL;
> +  }
> +
> +  return CalcConstFreq ();
> +}
> +
> +/**
> +  Converts elapsed ticks of performance counter to time in nanoseconds.
> +
> +  This function converts the elapsed ticks of running performance counter to
> +  time value in unit of nanoseconds.
> +
> +  @param  Ticks     The number of elapsed ticks of running performance counter.
> +
> +  @return The elapsed time in nanoseconds.
> +
> +**/
> +UINT64
> +EFIAPI
> +GetTimeInNanoSecond (
> +  IN UINT64  Ticks
> +  )
> +{
> +  UINT64         Frequency;
> +  UINT64         NanoSeconds;
> +  UINT64         Remainder;
> +  INTN           Shift;
> +  RETURN_STATUS  Status;
> +
> +  Frequency = GetPerformanceCounterProperties (NULL, NULL);
> +
> +  //
> +  //          Ticks
> +  // Time = --------- x 1,000,000,000
> +  //        Frequency
> +  //
> +  Status = SafeUint64Mult (
> +             DivU64x64Remainder (Ticks, Frequency, &Remainder),
> +             1000000000u,
> +             &NanoSeconds
> +             );
> +
> +  //
> +  // Ensure (Remainder * 1,000,000,000) will not overflow 64-bit.
> +  // Since 2^29 < 1,000,000,000 = 0x3B9ACA00 < 2^30, Remainder should < 2^(64-30) = 2^34,
> +  // i.e. highest bit set in Remainder should <= 33.
> +  //
> +  Shift     = MAX (0, HighBitSet64 (Remainder) - 33);
> +  Remainder = RShiftU64 (Remainder, (UINTN)Shift);
> +  Frequency = RShiftU64 (Frequency, (UINTN)Shift);
> +
> +  Status = SafeUint64Add (
> +             NanoSeconds,
> +             DivU64x64Remainder (
> +               MultU64x32 (Remainder, 1000000000u),
> +               Frequency,
> +               NULL
> +               ),
> +             &NanoSeconds
> +             );
> +  ASSERT_RETURN_ERROR (Status);
> +
> +  return NanoSeconds;
> +}


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#114848): https://edk2.groups.io/g/devel/message/114848
Mute This Topic: https://groups.io/mt/104068936/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



[-- Attachment #2: Type: text/html, Size: 10864 bytes --]

  parent reply	other threads:[~2024-01-31  3:31 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-26  6:27 [edk2-devel] [PATCH v8 00/37] Enable LoongArch virtual machine in edk2 Chao Li
2024-01-26  6:27 ` [edk2-devel] [PATCH v8 01/37] MdePkg: Add the header file named Csr.h for LoongArch64 Chao Li
2024-01-26  6:28 ` [edk2-devel] [PATCH v8 02/37] MdePkg: Add LoongArch64 FPU function set into BaseCpuLib Chao Li
2024-01-26  6:28 ` [edk2-devel] [PATCH v8 03/37] MdePkg: Add LoongArch64 exception function set into BaseLib Chao Li
2024-01-26  6:28 ` [edk2-devel] [PATCH v8 04/37] MdePkg: Add LoongArch64 local interrupt " Chao Li
2024-01-26  6:28 ` [edk2-devel] [PATCH v8 05/37] MdePkg: Add LoongArch Cpucfg function Chao Li
2024-01-26  6:28 ` [edk2-devel] [PATCH v8 06/37] MdePkg: Add read stable counter operation for LoongArch Chao Li
2024-01-26  6:28 ` [edk2-devel] [PATCH v8 07/37] MdePkg: Add CSR " Chao Li
2024-01-26  6:28 ` [edk2-devel] [PATCH v8 08/37] MdePkg: Add IOCSR " Chao Li
2024-01-26  6:28 ` [edk2-devel] [PATCH v8 09/37] MdePkg: Add a new library named PeiServicesTablePointerLibKs0 Chao Li
2024-01-26  6:28 ` [edk2-devel] [PATCH v8 10/37] MdePkg: Add some comments for LoongArch exceptions Chao Li
2024-01-26  6:29 ` [edk2-devel] [PATCH v8 11/37] UefiCpuPkg: Add LoongArch64 CPU Timer instance Chao Li
2024-02-02  3:24   ` Ni, Ray
2024-02-02  3:38     ` Chao Li
2024-01-26  6:29 ` [edk2-devel] [PATCH v8 12/37] UefiCpuPkg: Add CPU exception library for LoongArch Chao Li
2024-02-02  3:30   ` Ni, Ray
2024-02-02  3:44     ` Chao Li
2024-02-02  4:30       ` Ni, Ray
2024-03-08  8:02     ` Chao Li
2024-01-26  6:29 ` [edk2-devel] [PATCH v8 13/37] UefiCpuPkg: Add CpuMmuLib.h to UefiCpuPkg Chao Li
2024-01-26  6:29 ` [edk2-devel] [PATCH v8 14/37] UefiCpuPkg: Add CpuMmuLib " Chao Li
2024-01-31  9:47   ` Laszlo Ersek
2024-02-01  7:57     ` Chao Li
2024-02-01 22:46       ` Laszlo Ersek
2024-02-02  3:30         ` Chao Li
2024-02-02  3:33       ` Ni, Ray
2024-02-02  3:50         ` Chao Li
2024-02-02  4:30           ` Ni, Ray
2024-03-01  1:26             ` Chao Li
2024-03-01 11:27               ` Laszlo Ersek
2024-03-04  3:39                 ` Chao Li
2024-03-05  9:26                   ` Laszlo Ersek
2024-03-05 11:50                     ` Chao Li
2024-03-05 12:09                       ` Laszlo Ersek
2024-03-05 12:12                         ` Chao Li
     [not found]             ` <17B87F9FA8D0E543.14067@groups.io>
2024-03-01  1:53               ` Chao Li
2024-01-31 10:33   ` Pedro Falcato
2024-01-31 13:41     ` Laszlo Ersek
2024-01-31 17:46       ` Pedro Falcato
2024-02-01  3:05         ` Chao Li
2024-02-01 19:36           ` Pedro Falcato
2024-02-01 23:02             ` Laszlo Ersek
2024-02-02 15:14             ` Leif Lindholm
2024-02-04  2:58               ` Chao Li
     [not found]               ` <17B0898B4883051D.13964@groups.io>
2024-02-06  2:57                 ` Chao Li
2024-02-06 14:32                   ` Laszlo Ersek
2024-02-06 16:45                     ` Pedro Falcato
2024-01-26  6:29 ` [edk2-devel] [PATCH v8 15/37] UefiCpuPkg: Add multiprocessor library for LoongArch64 Chao Li
2024-01-26  6:29 ` [edk2-devel] [PATCH v8 16/37] UefiCpuPkg: Add CpuDxe driver " Chao Li
2024-01-26  6:29 ` [edk2-devel] [PATCH v8 17/37] EmbeddedPkg: Add PcdPrePiCpuIoSize width for LOONGARCH64 Chao Li
2024-01-26  6:29 ` [edk2-devel] [PATCH v8 18/37] ArmVirtPkg: Move PCD of FDT base address and FDT padding to OvmfPkg Chao Li
2024-02-01 23:20   ` Laszlo Ersek
2024-01-26  6:29 ` [edk2-devel] [PATCH v8 19/37] UefiCpuPkg: Add a new CPU IO 2 driver named CpuMmio2Dxe Chao Li
2024-01-26  6:29 ` [edk2-devel] [PATCH v8 20/37] ArmVirtPkg: Enable CpuMmio2Dxe Chao Li
2024-02-01 22:19   ` Laszlo Ersek
2024-01-26  6:30 ` [edk2-devel] [PATCH v8 21/37] OvmfPkg/RiscVVirt: " Chao Li
2024-01-26  6:30 ` [edk2-devel] [PATCH v8 22/37] OvmfPkg/RiscVVirt: Remove PciCpuIo2Dxe from RiscVVirt Chao Li
2024-01-26  6:30 ` [edk2-devel] [PATCH v8 23/37] ArmVirtPkg: Move the FdtSerialPortAddressLib to OvmfPkg Chao Li
2024-01-29 19:27   ` Laszlo Ersek
2024-01-26  6:30 ` [edk2-devel] [PATCH v8 24/37] ArmVirtPkg: Move two PCD variables into OvmfPkg Chao Li
2024-01-29 19:49   ` Laszlo Ersek
2024-01-30  1:24     ` Chao Li
2024-01-30 16:45       ` Laszlo Ersek
2024-01-31  1:30         ` Chao Li
2024-01-26  6:30 ` [edk2-devel] [PATCH v8 25/37] ArmVirtPkg: Move PlatformBootManagerLib to OvmfPkg Chao Li
2024-01-29 19:51   ` Laszlo Ersek
2024-01-26  6:30 ` [edk2-devel] [PATCH v8 26/37] OvmfPkg/LoongArchVirt: Add stable timer driver Chao Li
2024-01-26  6:30 ` [edk2-devel] [PATCH v8 27/37] OvmfPkg/LoongArchVirt: Add a NULL library named CollectApResouceLibNull Chao Li
2024-01-26  6:30 ` [edk2-devel] [PATCH v8 28/37] OvmfPkg/LoongArchVirt: Add serial port hook library Chao Li
2024-01-26  6:30 ` [edk2-devel] [PATCH v8 29/37] OvmfPkg/LoongArchVirt: Add the early serial port output library Chao Li
2024-01-26  6:30 ` [edk2-devel] [PATCH v8 30/37] OvmfPkg/LoongArchVirt: Add real time clock library Chao Li
2024-01-26  6:30 ` [edk2-devel] [PATCH v8 31/37] OvmfPkg/LoongArchVirt: Add NorFlashQemuLib Chao Li
2024-01-26  6:30 ` [edk2-devel] [PATCH v8 32/37] OvmfPkg/LoongArchVirt: Add FdtQemuFwCfgLib Chao Li
2024-01-26  6:31 ` [edk2-devel] [PATCH v8 33/37] OvmfPkg/LoongArchVirt: Add reset system library Chao Li
2024-01-26  6:31 ` [edk2-devel] [PATCH v8 34/37] OvmfPkg/LoongArchVirt: Support SEC phase Chao Li
2024-01-26  6:31 ` [edk2-devel] [PATCH v8 35/37] OvmfPkg/LoongArchVirt: Support PEI phase Chao Li
2024-01-26  6:31 ` [edk2-devel] [PATCH v8 36/37] OvmfPkg/LoongArchVirt: Add build file Chao Li
2024-01-26  6:31 ` [edk2-devel] [PATCH v8 37/37] OvmfPkg/LoongArchVirt: Add self introduction file Chao Li
     [not found] ` <17ADD1D5A196C454.24595@groups.io>
2024-01-31  3:30   ` Chao Li [this message]
     [not found]   ` <17AF510405DE784C.15701@groups.io>
2024-01-31  5:28     ` [edk2-devel] [PATCH v8 11/37] UefiCpuPkg: Add LoongArch64 CPU Timer instance Chao Li
2024-01-31 10:47       ` Laszlo Ersek
     [not found] ` <17ADD1D7001C37D6.11113@groups.io>
2024-01-31  3:31   ` [edk2-devel] [PATCH v8 12/37] UefiCpuPkg: Add CPU exception library for LoongArch Chao Li
     [not found]   ` <17AF510933F4B8FA.15701@groups.io>
2024-01-31  5:29     ` Chao Li
     [not found] ` <17ADD1D9CA04F352.11113@groups.io>
2024-01-31  3:31   ` [edk2-devel] [PATCH v8 14/37] UefiCpuPkg: Add CpuMmuLib to UefiCpuPkg Chao Li
     [not found]   ` <17AF511188DE2475.15701@groups.io>
2024-01-31  5:32     ` Chao Li
     [not found] ` <17ADD1DB56FC4702.24595@groups.io>
2024-01-31  3:32   ` [edk2-devel] [PATCH v8 15/37] UefiCpuPkg: Add multiprocessor library for LoongArch64 Chao Li
     [not found]   ` <17AF511741BD9C8B.15701@groups.io>
2024-01-31  5:33     ` Chao Li
     [not found] ` <17ADD1DCBDD4B7FE.11113@groups.io>
2024-01-31  3:32   ` [edk2-devel] [PATCH v8 16/37] UefiCpuPkg: Add CpuDxe driver " Chao Li
     [not found]   ` <17AF511F29808828.16460@groups.io>
2024-01-31  5:33     ` Chao Li

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=bdf49ce9-2fd6-4b22-ae25-dde6d449c7c5@loongson.cn \
    --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