Overview -------- This patch series changes struct system_counterval_t to identify the clocksource through enum clocksource_ids, rather than through struct clocksource *. The net effect of the patch series is that get_device_system_crosststamp() callers can supply clocksource ids instead of clocksource pointers. The pointers can be problematic to get hold of. The series is also available at https://github.com/OpenSynergy/linux clocksource-id-for-xtstamp-v3 Motivation ---------- The immediate motivation for this patch series is to enable the virtio_rtc RFC driver (v3 cf. [1]) to refer to the Arm Generic Timer clocksource without requiring new helper functions in the arm_arch_timer driver. Other future get_device_system_crosststamp() users may profit from this change as well. Clocksource structs are normally private to clocksource drivers. Therefore, get_device_system_crosststamp() callers require that clocksource drivers expose the clocksource of interest in some way. Drivers such as virtio_rtc could obtain all information for calling get_device_system_crosststamp() from their bound device, except for clocksource identification. Often, such drivers' only direct relation with the clocksource driver is clocksource identification. So using the clocksource enum, rather than obtaining pointers in a clocksource driver specific way, would reduce the coupling between the get_device_system_crosststamp() callers and clocksource drivers. Affected Code ------------- This series modifies code which is relevant to get_device_system_crosststamp(), in timekeeping, ptp/kvm, x86/kvm, and x86/tsc. There are two sorts of get_device_system_crosststamp() callers in the current kernel: 1) On Intel platforms, some PTP hardware clocks, and the HDA controller, obtain the clocksource pointer for get_device_system_crosststamp() using convert_art_to_tsc() or convert_art_ns_to_tsc() from arch/x86. 2) The ptp_kvm driver uses kvm_arch_ptp_get_crosststamp(), which is implemented for platforms with kvm_clock (x86) or arm_arch_timer. Amongst other things, kvm_arch_ptp_get_crosststamp() returns a clocksource pointer. The Arm implementation is in the arm_arch_timer driver. Changes ------- The series does the following: - add clocksource ID to the get_device_system_crosststamp() param type - add required clocksource ids and set them in get_device_system_crosststamp() users - evaluate clocksource ID in get_device_system_crosststamp(), rather than clocksource pointer - remove now obsolete clocksource pointer field and related code This series should not alter any behavior. This series is a prerequisite for the virtio_rtc driver [1]. Verification ------------ Out of the existing get_device_system_crosststamp() users, only ptp_kvm has been tested (on x86-64 and arm64). For each patch, with next-20240131 and mainline 1bbb19b6eb1b, on x86-64 and arm64: - built allmodconfig, allyesconfig, tinyconfig with GCC and LLVM (with a few unrelated features turned off) - runtime-tested ptp_kvm, checking ioctl PTP_SYS_OFFSET_PRECISE return codes and clock synchronization success (reverted unrelated "tty: serial: amba-pl011: Remove QDF2xxx workarounds" from linux-next on arm64, to get QEMU with console working) Changelog --------- v3: - Drop RFC. - Omit redundant clocksource_ids.h includes (Andy Shevchenko). - Fix tsc.c kernel-doc warnings, omitting some redundant documentation (Simon Horman). - Document relevant verification. - Improve commit message wording. v2: - Align existing changes with sketch [2] by Thomas Gleixner (omitting additional clocksource base changes from [2]). - Add follow-up improvements in ptp_kvm and kvmclock. - Split patches differently (Thomas Gleixner). - Refer to clocksource IDs as such in comments (Thomas Gleixner). - Update comments which were still referring to clocksource pointers. [1] https://lore.kernel.org/lkml/20231218073849.35294-1-peter.hilber@xxxxxxxxxxxxxxx/ [2] https://lore.kernel.org/lkml/87lec15i4b.ffs@tglx/ Peter Hilber (8): x86/tsc: Fix major kernel-doc warnings for tsc.c timekeeping: Add clocksource ID to struct system_counterval_t x86/tsc: Add clocksource ID, set system_counterval_t.cs_id x86/kvm, ptp/kvm: Add clocksource ID, set system_counterval_t.cs_id ptp/kvm, arm_arch_timer: Set system_counterval_t.cs_id to constant timekeeping: Evaluate system_counterval_t.cs_id instead of .cs treewide: Remove system_counterval_t.cs, which is never read kvmclock: Unexport kvmclock clocksource arch/x86/include/asm/kvmclock.h | 2 -- arch/x86/kernel/kvmclock.c | 4 ++-- arch/x86/kernel/tsc.c | 28 +++++++++++++++------------- drivers/clocksource/arm_arch_timer.c | 6 +++--- drivers/ptp/ptp_kvm_common.c | 10 +++++----- drivers/ptp/ptp_kvm_x86.c | 4 ++-- include/linux/clocksource_ids.h | 3 +++ include/linux/ptp_kvm.h | 4 ++-- include/linux/timekeeping.h | 10 ++++++---- kernel/time/timekeeping.c | 9 +++++---- 10 files changed, 43 insertions(+), 37 deletions(-) base-commit: 06f658aadff0e483ee4f807b0b46c9e5cba62bfa -- 2.40.1