SbiSetTimer expects core tick value. Cc: Andrei Warkentin <andrei.warken...@intel.com> Signed-off-by: Tuan Phan <tp...@ventanamicro.com> Reviewed-by: Sunil V L <suni...@ventanamicro.com> --- V2: Fixed format issue with uncrustify.
.../CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf | 3 +++ UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c | 26 ++++++++++++++++--- UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf b/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf index c76bd9648373..aba660186dc0 100644 --- a/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf +++ b/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf @@ -40,6 +40,9 @@ Timer.h Timer.c +[Pcd] + gUefiCpuPkgTokenSpaceGuid.PcdCpuCoreCrystalClockFrequency ## CONSUMES + [Protocols] gEfiCpuArchProtocolGuid ## CONSUMES gEfiTimerArchProtocolGuid ## PRODUCES diff --git a/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c index fa957ba5e3e9..358057e7c6a4 100644 --- a/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c +++ b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c @@ -80,8 +80,15 @@ TimerInterruptHandler ( return; } - mLastPeriodStart = PeriodStart; - SbiSetTimer (PeriodStart += mTimerPeriod); + mLastPeriodStart = PeriodStart; + PeriodStart += DivU64x32 ( + MultU64x32 ( + mTimerPeriod, + PcdGet64 (PcdCpuCoreCrystalClockFrequency) + ), + 1000000u + ); // convert to tick + SbiSetTimer (PeriodStart); RiscVEnableTimerInterrupt (); // enable SMode timer int gBS->RestoreTPL (OriginalTPL); } @@ -163,6 +170,8 @@ TimerDriverSetTimerPeriod ( IN UINT64 TimerPeriod ) { + UINT64 PeriodStart; + DEBUG ((DEBUG_INFO, "TimerDriverSetTimerPeriod(0x%lx)\n", TimerPeriod)); if (TimerPeriod == 0) { @@ -171,9 +180,18 @@ TimerDriverSetTimerPeriod ( return EFI_SUCCESS; } - mTimerPeriod = TimerPeriod / 10; // convert unit from 100ns to 1us + mTimerPeriod = TimerPeriod / 10; // convert unit from 100ns to 1us + mLastPeriodStart = RiscVReadTimer (); - SbiSetTimer (mLastPeriodStart + mTimerPeriod); + PeriodStart = mLastPeriodStart; + PeriodStart += DivU64x32 ( + MultU64x32 ( + mTimerPeriod, + PcdGet64 (PcdCpuCoreCrystalClockFrequency) + ), + 1000000u + ); // convert to tick + SbiSetTimer (PeriodStart); mCpu->EnableInterrupt (mCpu); RiscVEnableTimerInterrupt (); // enable SMode timer int diff --git a/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h index 586eb0cfadb4..9b3542230cb5 100644 --- a/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h +++ b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h @@ -21,7 +21,7 @@ #include <Library/IoLib.h> // -// RISC-V use 100us timer. +// RISC-V use 100ns timer. // The default timer tick duration is set to 10 ms = 10 * 1000 * 10 100 ns units // #define DEFAULT_TIMER_TICK_DURATION 100000 -- 2.25.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#105877): https://edk2.groups.io/g/devel/message/105877 Mute This Topic: https://groups.io/mt/99389883/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-