From: "Chao Li" <lichao@loongson.cn>
To: devel@edk2.groups.io, Ray Ni <ray.ni@intel.com>,
Laszlo Ersek <lersek@redhat.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 13:28:19 +0800 [thread overview]
Message-ID: <cd97281f-9d79-4703-a6e3-c94520ce822a@loongson.cn> (raw)
In-Reply-To: <17AF510405DE784C.15701@groups.io>
[-- Attachment #1: Type: text/plain, Size: 10378 bytes --]
Hi Ray and Laszlo,
I would very much like to be merged into stable202302, the soft feature
deadline is 2024-02-05, so could you please hlep to review this patch as
soon as passable? Please...
Thanks,
Chao
On 2024/1/31 11:30, Chao Li wrote:
>
> Hi Ray,
>
> Can you please help to review this patch again?
>
> 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 (#114860): https://edk2.groups.io/g/devel/message/114860
Mute This Topic: https://groups.io/mt/104070166/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: 11650 bytes --]
next prev parent reply other threads:[~2024-01-31 5:30 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 ` [edk2-devel] [PATCH v8 11/37] UefiCpuPkg: Add LoongArch64 CPU Timer instance Chao Li
[not found] ` <17AF510405DE784C.15701@groups.io>
2024-01-31 5:28 ` Chao Li [this message]
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=cd97281f-9d79-4703-a6e3-c94520ce822a@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