mirror of
https://github.com/SerenityOS/serenity.git
synced 2025-01-23 01:41:59 -05:00
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:
parent
8582f0720f
commit
d061da4cf5
2 changed files with 8 additions and 17 deletions
|
@ -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())
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue