From: "xianglai" <lixianglai@loongson.cn>
To: devel@edk2.groups.io, 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: Tue, 13 Sep 2022 10:35:56 +0800 (GMT+08:00) [thread overview]
Message-ID: <6c69d4c6.7ce1.18334b4049f.Coremail.lixianglai@loongson.cn> (raw)
In-Reply-To: <CO1PR11MB4929E9A3F82D1A4D90AB5127D2439@CO1PR11MB4929.namprd11.prod.outlook.com>
Hi,Mike:
Thank you for helping to review the code.
I feel sorry for the late reply, September 10 to September 12 is our Mid-Autumn Festival holiday,
Happy Mid-Autumn Festival.
1.The list of s files in all patches is :
./Library/MmuLib/Mmu.S This file is related to mmu and implements the page table refill exception.
./Library/StableTimerLib/Count.S This file implements the interrupt enable function.
./Sec/LoongArch64/Start.S This file implements the initialization of the SEC phase after the cpu starts
and the code related to switching from the assembly environment to the C environment for execution.
./Drivers/CpuDxe/LoongArch64/Fpu.S This file implements the fpu initialization function.
./Drivers/CpuDxe/LoongArch64/LoongArch.S This file is related to exceptions, including the implementation of the exception entry function,
saving and replying to the scene, and setting the exception entry address.
loongarch structure cpu defines a series of control status registers (CSR),
their read and write operations need to be completed through the csrrd and csrwr instructions,
can not be accessed directly through the address, so these assemblies are not optimized.
2. I didn't find the Tab character in this patch.
I have tried several search methods:
grep $'\t' -nr ./
grep ' ' -nr ./
/^I in vim
Best wishes.
xianglai.
> -----原始邮件-----
> 发件人: "Michael D Kinney" <michael.d.kinney@intel.com>
> 发送时间:2022-09-10 00:49:00 (星期六)
> 收件人: "devel@edk2.groups.io" <devel@edk2.groups.io>, "lixianglai@loongson.cn" <lixianglai@loongson.cn>, "Kinney, Michael D" <michael.d.kinney@intel.com>
> 抄送: "maobibo@loongson.cn" <maobibo@loongson.cn>
> 主题: Re: [edk2-devel] [edk2-platforms][PATCH V1 06/16] Platform/Loongson: Add StableTimerLib.
>
> 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]
> > -=-=-=-=-=-=
> >
>
>
>
>
>
>
本邮件及其附件含有龙芯中科的商业秘密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制或散发)本邮件及其附件中的信息。如果您错收本邮件,请您立即电话或邮件通知发件人并删除本邮件。
This email and its attachments contain confidential information from Loongson Technology , which is intended only for the person or entity whose address is listed above. Any use of the information contained herein in any way (including, but not limited to, total or partial disclosure, reproduction or dissemination) by persons other than the intended recipient(s) is prohibited. If you receive this email in error, please notify the sender by phone or email immediately and delete it.
next prev parent reply other threads:[~2022-09-13 2:36 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 ` [edk2-devel] " Michael D Kinney
2022-09-13 2:35 ` xianglai [this message]
[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=6c69d4c6.7ce1.18334b4049f.Coremail.lixianglai@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