Kernel: Deduplicate HardwareTimerBase::frequency()/ticks_per_second()

This commit is contained in:
Idan Horowitz 2024-04-23 18:03:48 +03:00 committed by Andrew Kaster
parent b89030f947
commit d3e285c253
Notes: sideshowbarker 2024-07-16 22:18:54 +09:00
14 changed files with 13 additions and 42 deletions

View file

@ -82,9 +82,9 @@ u64 Timer::update_time(u64& seconds_since_boot, u32& ticks_this_second, bool que
}
u64 ticks_since_last_second = (u64)ticks_this_second + delta_ticks;
auto ticks_per_second = frequency();
seconds_since_boot += ticks_since_last_second / ticks_per_second;
ticks_this_second = ticks_since_last_second % ticks_per_second;
auto frequency = ticks_per_second();
seconds_since_boot += ticks_since_last_second / frequency;
ticks_this_second = ticks_since_last_second % frequency;
if (!query_only) {
m_main_counter_drift = 0;
@ -92,7 +92,7 @@ u64 Timer::update_time(u64& seconds_since_boot, u32& ticks_this_second, bool que
}
// Return the time passed (in ns) since last time update_time was called
return (delta_ticks * 1000000000ull) / ticks_per_second;
return (delta_ticks * 1000000000ull) / frequency;
}
void Timer::enable_interrupt_mode()

View file

@ -24,7 +24,6 @@ public:
virtual HardwareTimerType timer_type() const override { return HardwareTimerType::RPiTimer; }
virtual StringView model() const override { return "RPi Timer"sv; }
virtual size_t ticks_per_second() const override { return m_frequency; }
virtual bool is_periodic() const override { TODO_AARCH64(); }
virtual bool is_periodic_capable() const override { TODO_AARCH64(); }

View file

@ -57,9 +57,9 @@ u64 Timer::update_time(u64& seconds_since_boot, u32& ticks_this_second, bool que
}
u64 ticks_since_last_second = (u64)ticks_this_second + delta_ticks;
auto ticks_per_second = frequency();
seconds_since_boot += ticks_since_last_second / ticks_per_second;
ticks_this_second = ticks_since_last_second % ticks_per_second;
auto frequency = ticks_per_second();
seconds_since_boot += ticks_since_last_second / frequency;
ticks_this_second = ticks_since_last_second % frequency;
if (!query_only) {
m_main_counter_drift = 0;
@ -67,7 +67,7 @@ u64 Timer::update_time(u64& seconds_since_boot, u32& ticks_this_second, bool que
}
// Return the time passed (in ns) since last time update_time was called
return (delta_ticks * 1000000000ull) / ticks_per_second;
return (delta_ticks * 1000000000ull) / frequency;
}
void Timer::set_compare(u64 compare)

View file

@ -19,7 +19,6 @@ public:
virtual HardwareTimerType timer_type() const override { return HardwareTimerType::RISCVTimer; }
virtual StringView model() const override { return "RISC-V Timer"sv; }
virtual size_t ticks_per_second() const override { return m_frequency; }
virtual bool is_periodic() const override { TODO_RISCV64(); }
virtual bool is_periodic_capable() const override { TODO_RISCV64(); }

View file

@ -141,11 +141,6 @@ void APICTimer::disable_local_timer()
APIC::the().setup_local_timer(0, APIC::TimerMode::OneShot, false);
}
size_t APICTimer::ticks_per_second() const
{
return m_frequency;
}
void APICTimer::set_periodic()
{
// FIXME: Implement it...

View file

@ -18,7 +18,6 @@ public:
static APICTimer* initialize(u8, HardwareTimerBase&);
virtual HardwareTimerType timer_type() const override { return HardwareTimerType::LocalAPICTimer; }
virtual StringView model() const override { return "LocalAPIC"sv; }
virtual size_t ticks_per_second() const override;
virtual bool is_periodic() const override { return m_timer_mode == APIC::TimerMode::Periodic; }
virtual bool is_periodic_capable() const override { return true; }

View file

@ -68,11 +68,6 @@ void HPETComparator::set_new_countdown()
HPET::the().update_non_periodic_comparator_value(*this);
}
size_t HPETComparator::ticks_per_second() const
{
return m_frequency;
}
void HPETComparator::reset_to_default_ticks_per_second()
{
dbgln("reset_to_default_ticks_per_second");

View file

@ -25,8 +25,6 @@ public:
bool is_enabled() const { return m_enabled; }
bool is_64bit_capable() const { return m_is_64bit_capable; }
virtual size_t ticks_per_second() const override;
virtual bool is_periodic() const override { return m_periodic; }
virtual bool is_periodic_capable() const override { return m_periodic_capable; }
virtual void set_periodic() override;

View file

@ -39,11 +39,6 @@ PIT::PIT(Function<void(RegisterState const&)> callback)
enable_irq();
}
size_t PIT::ticks_per_second() const
{
return m_frequency;
}
void PIT::set_periodic()
{
IO::out8(PIT_CTL, TIMER0_CTL | WRITE_WORD | MODE_SQUARE_WAVE);

View file

@ -37,7 +37,6 @@ public:
static NonnullLockRefPtr<PIT> initialize(Function<void(RegisterState const&)>);
virtual HardwareTimerType timer_type() const override { return HardwareTimerType::i8253; }
virtual StringView model() const override { return "i8254"sv; }
virtual size_t ticks_per_second() const override;
virtual bool is_periodic() const override { return m_periodic; }
virtual bool is_periodic_capable() const override { return true; }

View file

@ -35,11 +35,6 @@ bool RealTimeClock::handle_irq(RegisterState const& regs)
return result;
}
size_t RealTimeClock::ticks_per_second() const
{
return m_frequency;
}
void RealTimeClock::reset_to_default_ticks_per_second()
{
InterruptDisabler disabler;

View file

@ -16,7 +16,6 @@ public:
static NonnullLockRefPtr<RealTimeClock> create(Function<void(RegisterState const&)> callback);
virtual HardwareTimerType timer_type() const override { return HardwareTimerType::RTC; }
virtual StringView model() const override { return "Real Time Clock"sv; }
virtual size_t ticks_per_second() const override;
virtual bool is_periodic() const override { return true; }
virtual bool is_periodic_capable() const override { return true; }

View file

@ -50,7 +50,6 @@ public:
virtual void set_periodic() = 0;
virtual void set_non_periodic() = 0;
virtual void disable() = 0;
virtual u32 frequency() const = 0;
virtual bool can_query_raw() const { return false; }
virtual u64 current_raw() const { return 0; }
virtual u64 raw_to_ns(u64) const { return 0; }
@ -89,7 +88,7 @@ public:
return previous_callback;
}
virtual u32 frequency() const override { return (u32)m_frequency; }
virtual size_t ticks_per_second() const override { return m_frequency; }
protected:
HardwareTimer(u8 irq_number, Function<void(RegisterState const&)> callback = nullptr)
@ -141,8 +140,7 @@ public:
virtual HandlerType type() const override { return HandlerType::IRQHandler; }
virtual StringView controller() const override { return {}; }
virtual bool eoi() override;
virtual u32 frequency() const override { return (u32)m_frequency; }
virtual size_t ticks_per_second() const override { return m_frequency; }
protected:
HardwareTimer(u8 irq_number, Function<void(RegisterState const&)> callback = nullptr)

View file

@ -461,7 +461,7 @@ UNMAP_AFTER_INIT bool TimeManagement::probe_and_set_aarch64_hardware_timers()
{
m_hardware_timers.append(RPi::Timer::initialize());
m_system_timer = m_hardware_timers[0];
m_time_ticks_per_second = m_system_timer->frequency();
m_time_ticks_per_second = m_system_timer->ticks_per_second();
m_system_timer->set_callback([this](RegisterState const& regs) {
auto seconds_since_boot = m_seconds_since_boot;
@ -490,7 +490,7 @@ UNMAP_AFTER_INIT bool TimeManagement::probe_and_set_riscv64_hardware_timers()
{
m_hardware_timers.append(RISCV64::Timer::initialize());
m_system_timer = m_hardware_timers[0];
m_time_ticks_per_second = m_system_timer->frequency();
m_time_ticks_per_second = m_system_timer->ticks_per_second();
m_system_timer->set_callback([this](RegisterState const& regs) {
auto seconds_since_boot = m_seconds_since_boot;
@ -525,7 +525,7 @@ void TimeManagement::increment_time_since_boot()
// Compute time adjustment for adjtime. Let the clock run up to 1% fast or slow.
// That way, adjtime can adjust up to 36 seconds per hour, without time getting very jumpy.
// Once we have a smarter NTP service that also adjusts the frequency instead of just slewing time, maybe we can lower this.
long nanos_per_tick = 1'000'000'000 / m_time_keeper_timer->frequency();
long nanos_per_tick = 1'000'000'000 / m_time_keeper_timer->ticks_per_second();
time_t max_slew_nanos = nanos_per_tick / 100;
u32 update_iteration = m_update2.fetch_add(1, AK::MemoryOrder::memory_order_acquire);