mirror of https://github.com/acidanthera/audk.git
UefiCpuPkg: CpuTimerDxeRiscV64: Fix incorrect value sent to SbiSetTimer
SbiSetTimer expects core tick value. Cc: Andrei Warkentin <andrei.warkentin@intel.com> Signed-off-by: Tuan Phan <tphan@ventanamicro.com> Reviewed-by: Sunil V L <sunilvl@ventanamicro.com>
This commit is contained in:
parent
aad98d915a
commit
4dba2a9d08
|
@ -40,6 +40,9 @@
|
|||
Timer.h
|
||||
Timer.c
|
||||
|
||||
[Pcd]
|
||||
gUefiCpuPkgTokenSpaceGuid.PcdCpuCoreCrystalClockFrequency ## CONSUMES
|
||||
|
||||
[Protocols]
|
||||
gEfiCpuArchProtocolGuid ## CONSUMES
|
||||
gEfiTimerArchProtocolGuid ## PRODUCES
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue