Kernel: Deduplicate HardwareTimerBase::frequency()/ticks_per_second()
This commit is contained in:
parent
b89030f947
commit
d3e285c253
Notes:
sideshowbarker
2024-07-16 22:18:54 +09:00
Author: https://github.com/IdanHo Commit: https://github.com/SerenityOS/serenity/commit/d3e285c253 Pull-request: https://github.com/SerenityOS/serenity/pull/24117 Reviewed-by: https://github.com/ADKaster Reviewed-by: https://github.com/spholz
14 changed files with 13 additions and 42 deletions
|
@ -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()
|
||||
|
|
|
@ -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(); }
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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(); }
|
||||
|
|
|
@ -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...
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue