Kernel/riscv64: Clean up Timer class

I just copy-pasted microseconds_since_boot and
set_interrupt_interval_usec from aarch64.
However, on RISC-V, they are not in microseconds.
The TimerRegisters struct is also unused.

current_time and set_compare can also be private and static.
This commit is contained in:
Sönke Holz 2024-01-18 17:14:04 +01:00 committed by Andrew Kaster
parent 8582f0720f
commit d061da4cf5
2 changed files with 8 additions and 17 deletions

View file

@ -15,12 +15,13 @@ Timer::Timer()
: HardwareTimer(to_underlying(CSR::SCAUSE::SupervisorTimerInterrupt) & ~CSR::SCAUSE_INTERRUPT_MASK) : HardwareTimer(to_underlying(CSR::SCAUSE::SupervisorTimerInterrupt) & ~CSR::SCAUSE_INTERRUPT_MASK)
{ {
// FIXME: Actually query the frequency of the timer from the device tree. // FIXME: Actually query the frequency of the timer from the device tree.
// Based on the "/cpus/timebase-frequency" device tree node for the QEMU virt machine // Based on the "/cpus/timebase-frequency" device tree node for the QEMU virt machine
m_frequency = 10'000'000; // in Hz m_frequency = 10'000'000; // in Hz
set_interrupt_interval_usec(m_frequency / OPTIMAL_TICKS_PER_SECOND_RATE); m_interrupt_interval = m_frequency / OPTIMAL_TICKS_PER_SECOND_RATE;
set_compare(microseconds_since_boot() + m_interrupt_interval); set_compare(current_ticks() + m_interrupt_interval);
RISCV64::CSR::set_bits(RISCV64::CSR::Address::SIE, 1 << interrupt_number()); RISCV64::CSR::set_bits(RISCV64::CSR::Address::SIE, 1 << interrupt_number());
} }
@ -31,7 +32,7 @@ NonnullLockRefPtr<Timer> Timer::initialize()
return timer; return timer;
} }
u64 Timer::microseconds_since_boot() u64 Timer::current_ticks()
{ {
return RISCV64::CSR::read(RISCV64::CSR::Address::TIME); return RISCV64::CSR::read(RISCV64::CSR::Address::TIME);
} }
@ -40,7 +41,7 @@ bool Timer::handle_interrupt(RegisterState const& regs)
{ {
auto result = HardwareTimer::handle_interrupt(regs); auto result = HardwareTimer::handle_interrupt(regs);
set_compare(microseconds_since_boot() + m_interrupt_interval); set_compare(current_ticks() + m_interrupt_interval);
return result; return result;
} }
@ -48,7 +49,7 @@ bool Timer::handle_interrupt(RegisterState const& regs)
u64 Timer::update_time(u64& seconds_since_boot, u32& ticks_this_second, bool query_only) u64 Timer::update_time(u64& seconds_since_boot, u32& ticks_this_second, bool query_only)
{ {
// Should only be called by the time keeper interrupt handler! // Should only be called by the time keeper interrupt handler!
u64 current_value = microseconds_since_boot(); u64 current_value = current_ticks();
u64 delta_ticks = m_main_counter_drift; u64 delta_ticks = m_main_counter_drift;
if (current_value >= m_main_counter_last_read) { if (current_value >= m_main_counter_last_read) {
delta_ticks += current_value - m_main_counter_last_read; delta_ticks += current_value - m_main_counter_last_read;
@ -71,11 +72,6 @@ u64 Timer::update_time(u64& seconds_since_boot, u32& ticks_this_second, bool que
return (delta_ticks * 1000000000ull) / ticks_per_second; return (delta_ticks * 1000000000ull) / ticks_per_second;
} }
void Timer::set_interrupt_interval_usec(u32 interrupt_interval)
{
m_interrupt_interval = interrupt_interval;
}
void Timer::set_compare(u64 compare) void Timer::set_compare(u64 compare)
{ {
if (SBI::Timer::set_timer(compare).is_error()) if (SBI::Timer::set_timer(compare).is_error())

View file

@ -13,8 +13,6 @@
namespace Kernel::RISCV64 { namespace Kernel::RISCV64 {
struct TimerRegisters;
class Timer final : public HardwareTimer<GenericInterruptHandler> { class Timer final : public HardwareTimer<GenericInterruptHandler> {
public: public:
static NonnullLockRefPtr<Timer> initialize(); static NonnullLockRefPtr<Timer> initialize();
@ -37,14 +35,11 @@ public:
// FIXME: Share code with HPET::update_time // FIXME: Share code with HPET::update_time
u64 update_time(u64& seconds_since_boot, u32& ticks_this_second, bool query_only); u64 update_time(u64& seconds_since_boot, u32& ticks_this_second, bool query_only);
u64 microseconds_since_boot();
void set_interrupt_interval_usec(u32);
private: private:
Timer(); Timer();
void set_compare(u64 compare); static u64 current_ticks();
static void set_compare(u64 compare);
//^ GenericInterruptHandler //^ GenericInterruptHandler
virtual bool handle_interrupt(RegisterState const&) override; virtual bool handle_interrupt(RegisterState const&) override;