]> www.infradead.org Git - users/jedix/linux-maple.git/commit
timekeeping: Add function to convert realtime to base clock
authorLakshmi Sowjanya D <lakshmi.sowjanya.d@intel.com>
Mon, 13 May 2024 10:38:10 +0000 (16:08 +0530)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 3 Jun 2024 09:18:51 +0000 (11:18 +0200)
commit02ecee07ca30f76f2a0f1381661a688b8e501ab0
tree789b1fab4a4398e4265070085ef3c9a378282def
parent0f532a789f1b24258043d0f856409d2ab974fb64
timekeeping: Add function to convert realtime to base clock

PPS (Pulse Per Second) generates a hardware pulse every second based on
CLOCK_REALTIME. This works fine when the pulse is generated in software
from a hrtimer callback function.

For hardware which generates the pulse by programming a timer it is
required to convert CLOCK_REALTIME to the underlying hardware clock.

The X86 Timed IO device is based on the Always Running Timer (ART), which
is the base clock of the TSC, which is usually the system clocksource on
X86.

The core code already has functionality to convert base clock timestamps to
system clocksource timestamps, but there is no support for converting the
other way around.

Provide the required functionality to support such devices in a generic
way to avoid code duplication in drivers:

  1) ktime_real_to_base_clock() to convert a CLOCK_REALTIME timestamp to a
     base clock timestamp

  2) timekeeping_clocksource_has_base() to allow drivers to validate that
     the system clocksource is based on a particular clocksource ID.

[ tglx: Simplify timekeeping_clocksource_has_base() and add missing READ_ONCE() ]

Co-developed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Co-developed-by: Christopher S. Hall <christopher.s.hall@intel.com>
Signed-off-by: Christopher S. Hall <christopher.s.hall@intel.com>
Signed-off-by: Lakshmi Sowjanya D <lakshmi.sowjanya.d@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20240513103813.5666-10-lakshmi.sowjanya.d@intel.com
include/linux/timekeeping.h
kernel/time/timekeeping.c