From: "Michael D Kinney" <michael.d.kinney@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
"lixianglai@loongson.cn" <lixianglai@loongson.cn>,
"Kinney, Michael D" <michael.d.kinney@intel.com>
Cc: "maobibo@loongson.cn" <maobibo@loongson.cn>
Subject: Re: [edk2-devel] [edk2-platforms][PATCH V1 06/16] Platform/Loongson: Add StableTimerLib.
Date: Fri, 9 Sep 2022 16:49:00 +0000 [thread overview]
Message-ID: <CO1PR11MB4929E9A3F82D1A4D90AB5127D2439@CO1PR11MB4929.namprd11.prod.outlook.com> (raw)
In-Reply-To: <9a53979093043d4da800cab803be9791e9af463c.1662691771.git.lixianglai@loongson.cn>
I see a mix of inline assembly and .S files. Recommend avoiding inline assembly.
Also appears to be some TAB characters in this patch. Convert tabs to spaces.
Mike
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of xianglai
> Sent: Thursday, September 8, 2022 8:12 PM
> To: devel@edk2.groups.io
> Cc: maobibo@loongson.cn
> Subject: [edk2-devel] [edk2-platforms][PATCH V1 06/16] Platform/Loongson: Add StableTimerLib.
>
> This library provides a delay interface and a timing interface.
>
> Signed-off-by: xianglai li <lixianglai@loongson.cn>
> ---
> .../Include/Library/StableTimer.h | 42 +++
> .../Library/StableTimerLib/Count.S | 26 ++
> .../Library/StableTimerLib/TimerLib.c | 262 ++++++++++++++++++
> .../Library/StableTimerLib/TimerLib.inf | 28 ++
> 4 files changed, 358 insertions(+)
> create mode 100644 Platform/Loongson/LoongArchQemuPkg/Include/Library/StableTimer.h
> create mode 100644 Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/Count.S
> create mode 100644 Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/TimerLib.c
> create mode 100644 Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/TimerLib.inf
>
> diff --git a/Platform/Loongson/LoongArchQemuPkg/Include/Library/StableTimer.h
> b/Platform/Loongson/LoongArchQemuPkg/Include/Library/StableTimer.h
> new file mode 100644
> index 0000000000..bd6a1eb90f
> --- /dev/null
> +++ b/Platform/Loongson/LoongArchQemuPkg/Include/Library/StableTimer.h
> @@ -0,0 +1,42 @@
> +/** @file
>
> +
>
> + Copyright (c) 2021 Loongson Technology Corporation Limited. All rights reserved.<BR>
>
> +
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +
>
> + @par Glossary:
>
> + - Csr - Cpu Status Register
>
> + - Calc - Calculation
>
> + - Freq - frequency
>
> +**/
>
> +
>
> +#ifndef STABLE_TIMER_H_
>
> +#define STABLE_TIMER_H_
>
> +#include "Library/Cpu.h"
>
> +
>
> +/**
>
> + Gets the timer count value.
>
> +
>
> + @param[] VOID
>
> +
>
> + @retval timer count value.
>
> +**/
>
> +UINTN
>
> +EFIAPI
>
> +CsrReadTime (
>
> + VOID
>
> + );
>
> +
>
> +/**
>
> + Calculate the timer frequency.
>
> +
>
> + @param[] VOID
>
> +
>
> + @retval Timer frequency.
>
> +**/
>
> +UINT32
>
> +EFIAPI
>
> +CalcConstFreq (
>
> + VOID
>
> + );
>
> +#endif
>
> diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/Count.S
> b/Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/Count.S
> new file mode 100644
> index 0000000000..42f878caf8
> --- /dev/null
> +++ b/Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/Count.S
> @@ -0,0 +1,26 @@
> +#------------------------------------------------------------------------------
>
> +#
>
> +# Count for LoongArch
>
> +#
>
> +# Copyright (c) 2021 Loongson Technology Corporation Limited. All rights reserved.<BR>
>
> +#
>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +#
>
> +#------------------------------------------------------------------------------
>
> +
>
> +#ifndef __ASSEMBLY__
>
> +#define __ASSEMBLY__
>
> +#endif
>
> +
>
> +#include "Library/Cpu.h"
>
> +#include "LoongArchAsmMacro.h"
>
> +#
>
> +# Set cpu interrupts
>
> +# @param A0 The interrupt number
>
> +#
>
> +ASM_FUNC(CpuSetIP)
>
> + csrrd T0, LOONGARCH_CSR_ECFG
>
> + or T0, T0, A0
>
> + csrwr T0, LOONGARCH_CSR_ECFG
>
> + jirl ZERO, RA,0
>
> +
>
> diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/TimerLib.c
> b/Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/TimerLib.c
> new file mode 100644
> index 0000000000..21e3749ee6
> --- /dev/null
> +++ b/Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/TimerLib.c
> @@ -0,0 +1,262 @@
> +/** @file
>
> + Generic LoongArch implementation of TimerLib.h
>
> +
>
> + Copyright (c) 2021 Loongson Technology Corporation Limited. All rights reserved.<BR>
>
> +
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +
>
> + @par Glossary:
>
> + - Freq - Frequency
>
> + - Csr - Cpu Status Register
>
> + - calc - calculate
>
> +**/
>
> +
>
> +#include <Base.h>
>
> +#include <Library/TimerLib.h>
>
> +#include <Library/BaseLib.h>
>
> +#include <Library/DebugLib.h>
>
> +#include "Library/StableTimer.h"
>
> +#include "Library/Cpu.h"
>
> +
>
> +UINT32 StableTimerFreq = 0;
>
> +
>
> +/**
>
> + Gets the timer count value.
>
> +
>
> + @param[] VOID
>
> +
>
> + @retval timer count value.
>
> +**/
>
> +UINTN
>
> +EFIAPI
>
> +CsrReadTime (
>
> + VOID
>
> + )
>
> +{
>
> + UINTN Value = 0;
>
> + __asm__ __volatile__(
>
> + " rdtime.d %0, $r0\n"
>
> + : "=r" (Value));
>
> + return Value;
>
> +}
>
> +
>
> +/**
>
> + Calculate the timer frequency.
>
> +
>
> + @param[] VOID
>
> +
>
> + @retval Timer frequency.
>
> +**/
>
> +UINT32
>
> +EFIAPI
>
> +CalcConstFreq (
>
> + VOID
>
> + )
>
> +{
>
> + UINT32 Result;
>
> + UINT32 BaseFreq;
>
> + UINT32 ClockMultiplier;
>
> + UINT32 ClockDivide;
>
> +
>
> + LOONGARCH_GET_CPUCFG (BaseFreq, LOONGARCH_CPUCFG4);
>
> + LOONGARCH_GET_CPUCFG (Result, LOONGARCH_CPUCFG5);
>
> + ClockMultiplier = Result & 0xffff;
>
> + ClockDivide = (Result >> 16) & 0xffff;
>
> +
>
> + if ((!BaseFreq)
>
> + || (!ClockMultiplier)
>
> + || (!ClockDivide))
>
> + {
>
> + return 0;
>
> + }
>
> + else {
>
> + return (BaseFreq * ClockMultiplier / ClockDivide);
>
> + }
>
> +}
>
> +/**
>
> + Get the timer frequency.
>
> +
>
> + @param[] VOID
>
> +
>
> + @retval Timer frequency.
>
> +**/
>
> +UINT32
>
> +EFIAPI
>
> +GetFreq (
>
> + VOID
>
> + )
>
> +{
>
> + if (StableTimerFreq) {
>
> + } else {
>
> + StableTimerFreq = CalcConstFreq ();
>
> + }
>
> +
>
> + 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
>
> + )
>
> +{
>
> +
>
> + UINTN Count;
>
> + UINTN Ticks;
>
> + UINTN Start;
>
> + UINTN End;
>
> +
>
> + Count = GetFreq ();
>
> + Count = (Count * MicroSeconds) / 1000000;
>
> + Start = CsrReadTime ();
>
> + End = Start + Count;
>
> +
>
> + do {
>
> + Ticks = CsrReadTime ();
>
> + } while (Ticks < End);
>
> +
>
> + 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
>
> + )
>
> +{
>
> + UINT32 MicroSeconds;
>
> +
>
> + if (NanoSeconds % 1000 == 0) {
>
> + MicroSeconds = NanoSeconds/1000;
>
> + }else {
>
> + MicroSeconds = NanoSeconds/1000 + 1;
>
> + }
>
> + MicroSecondDelay (MicroSeconds);
>
> +
>
> + return NanoSeconds;
>
> +}
>
> +
>
> +/**
>
> + Retrieves the current value of a 64-bit free running performance counter.
>
> +
>
> + Retrieves the current value of a 64-bit free running performance counter. The
>
> + counter can either count up by 1 or count down by 1. If the physical
>
> + performance counter counts by a larger increment, then the counter values
>
> + must be translated. The properties of the counter can be retrieved from
>
> + GetPerformanceCounterProperties ().
>
> +
>
> + @return The current value of the free running performance counter.
>
> +
>
> +**/
>
> +UINT64
>
> +EFIAPI
>
> +GetPerformanceCounter (
>
> + VOID
>
> + )
>
> +{
>
> + return CsrReadTime ();
>
> +}
>
> +/**
>
> + Retrieves the 64-bit frequency in Hz and the range of performance counter
>
> + values.
>
> +
>
> + If StartValue is not NULL, then the value that the performance counter starts
>
> + with immediately after is it rolls over is returned in StartValue. If
>
> + EndValue is not NULL, then the value that the performance counter end with
>
> + immediately before it rolls over is returned in EndValue. The 64-bit
>
> + frequency of the performance counter in Hz is always returned. If StartValue
>
> + is less than EndValue, then the performance counter counts up. If StartValue
>
> + is greater than EndValue, then the performance counter counts down. For
>
> + example, a 64-bit free running counter that counts up would have a StartValue
>
> + of 0 and an EndValue of 0xFFFFFFFFFFFFFFFF. A 24-bit free running counter
>
> + that counts down would have a StartValue of 0xFFFFFF and an EndValue of 0.
>
> +
>
> + @param StartValue The value the performance counter starts with when it
>
> + rolls over.
>
> + @param EndValue The value that the performance 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 = BIT2;
>
> + }
>
> +
>
> + if (EndValue != NULL) {
>
> + *EndValue = BIT48 - 1;
>
> + }
>
> +
>
> + return GetFreq ();
>
> +}
>
> +
>
> +/**
>
> + 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;
>
> +
>
> + Frequency = GetPerformanceCounterProperties (NULL, NULL);
>
> +
>
> + //
>
> + // Ticks
>
> + // Time = --------- x 1,000,000,000
>
> + // Frequency
>
> + //
>
> + NanoSeconds = MultU64x32 (DivU64x64Remainder (Ticks, Frequency, &Remainder), 1000000000u);
>
> +
>
> + //
>
> + // 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);
>
> + NanoSeconds += DivU64x64Remainder (MultU64x32 (Remainder, 1000000000u), Frequency, NULL);
>
> +
>
> + return NanoSeconds;
>
> +}
>
> diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/TimerLib.inf
> b/Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/TimerLib.inf
> new file mode 100644
> index 0000000000..fef0fac08c
> --- /dev/null
> +++ b/Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/TimerLib.inf
> @@ -0,0 +1,28 @@
> +## @file
>
> +# Generic LoongArch implementation of TimerLib.h
>
> +#
>
> +# Copyright (c) 2021 Loongson Technology Corporation Limited. All rights reserved.<BR>
>
> +#
>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +#
>
> +##
>
> +
>
> +[Defines]
>
> + INF_VERSION = 0x00010005
>
> + BASE_NAME = TimerLib
>
> + FILE_GUID = 740389C7-CC44-4A2F-88DC-89D97D312E7C
>
> + MODULE_TYPE = BASE
>
> + VERSION_STRING = 1.0
>
> + LIBRARY_CLASS = TimerLib
>
> +
>
> +[Sources.common]
>
> + TimerLib.c
>
> + Count.S
>
> +
>
> +[Packages]
>
> + Platform/Loongson/LoongArchQemuPkg/Loongson.dec
>
> + MdePkg/MdePkg.dec
>
> +
>
> +[LibraryClasses]
>
> + DebugLib
>
> + IoLib
>
> --
> 2.31.1
>
>
>
> -=-=-=-=-=-=
> Groups.io Links: You receive all messages sent to this group.
> View/Reply Online (#93560): https://edk2.groups.io/g/devel/message/93560
> Mute This Topic: https://groups.io/mt/93565582/1643496
> Group Owner: devel+owner@edk2.groups.io
> Unsubscribe: https://edk2.groups.io/g/devel/unsub [michael.d.kinney@intel.com]
> -=-=-=-=-=-=
>
next prev parent reply other threads:[~2022-09-09 16:49 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-09 3:11 [edk2-platforms][PATCH V1 00/16] Platform: Add Loongson support xianglai
2022-09-09 3:11 ` [edk2-platforms][PATCH V1 01/16] Platform/Loongson: Add Serial Port library xianglai
2022-09-09 8:44 ` 回复: [edk2-devel] " gaoliming
2022-09-09 9:08 ` xianglai
2022-09-09 10:40 ` Chao Li
2022-09-09 3:11 ` [edk2-platforms][PATCH V1 02/16] Platform/Loongson: Support SEC And Add Readme.md xianglai
2022-09-09 3:11 ` [edk2-platforms][PATCH V1 03/16] Platform/Loongson: Add PeiServicesTablePointerLib xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 04/16] Platform/Loongson: Add QemuFwCfgLib xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 05/16] Platform/Loongson: Add MmuLib xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 06/16] Platform/Loongson: Add StableTimerLib xianglai
2022-09-09 16:49 ` Michael D Kinney [this message]
2022-09-13 2:35 ` [edk2-devel] " xianglai
[not found] ` <17144AF1748B76B9.3485@groups.io>
2022-09-13 9:46 ` xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 07/16] Platform/Loongson: Support PEI phase xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 08/16] Platform/Loongson: Add CPU DXE driver xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 09/16] Platform/Loongson: Add PciCpuIoDxe driver xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 10/16] Platform/Loongson: Add timer Dxe driver xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 11/16] Platform/Loongson: Add RealTime Clock lib xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 12/16] Platform/Loongson: Add Platform Boot Manager Lib xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 13/16] Platform/Loongson: Add Reset System Lib xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 14/16] Platform/Loongson: Support Dxe xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 15/16] Platform/Loongson: Add QemuFlashFvbServicesRuntimeDxe driver xianglai
2022-09-09 3:12 ` [edk2-platforms][PATCH V1 16/16] Platform/Loongson: Support for saving variables to flash xianglai
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=CO1PR11MB4929E9A3F82D1A4D90AB5127D2439@CO1PR11MB4929.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