From d061da4cf5541f5e2b49fa31178c67b07dde2296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Thu, 18 Jan 2024 17:14:04 +0100 Subject: [PATCH] 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. --- Kernel/Arch/riscv64/Timer.cpp | 16 ++++++---------- Kernel/Arch/riscv64/Timer.h | 9 ++------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/Kernel/Arch/riscv64/Timer.cpp b/Kernel/Arch/riscv64/Timer.cpp index ac252e472c..96a595a0b6 100644 --- a/Kernel/Arch/riscv64/Timer.cpp +++ b/Kernel/Arch/riscv64/Timer.cpp @@ -15,12 +15,13 @@ Timer::Timer() : HardwareTimer(to_underlying(CSR::SCAUSE::SupervisorTimerInterrupt) & ~CSR::SCAUSE_INTERRUPT_MASK) { // 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 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()); } @@ -31,7 +32,7 @@ NonnullLockRefPtr Timer::initialize() return timer; } -u64 Timer::microseconds_since_boot() +u64 Timer::current_ticks() { 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); - set_compare(microseconds_since_boot() + m_interrupt_interval); + set_compare(current_ticks() + m_interrupt_interval); 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) { // 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; if (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; } -void Timer::set_interrupt_interval_usec(u32 interrupt_interval) -{ - m_interrupt_interval = interrupt_interval; -} - void Timer::set_compare(u64 compare) { if (SBI::Timer::set_timer(compare).is_error()) diff --git a/Kernel/Arch/riscv64/Timer.h b/Kernel/Arch/riscv64/Timer.h index 55db7f1a25..45f90c5691 100644 --- a/Kernel/Arch/riscv64/Timer.h +++ b/Kernel/Arch/riscv64/Timer.h @@ -13,8 +13,6 @@ namespace Kernel::RISCV64 { -struct TimerRegisters; - class Timer final : public HardwareTimer { public: static NonnullLockRefPtr initialize(); @@ -37,14 +35,11 @@ public: // FIXME: Share code with HPET::update_time 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: Timer(); - void set_compare(u64 compare); + static u64 current_ticks(); + static void set_compare(u64 compare); //^ GenericInterruptHandler virtual bool handle_interrupt(RegisterState const&) override;