[PATCH v2 2/3] clocksource/drivers/arm_arch_timer: Handle time offset prior to epoch

From: Leo Yan
Date: Tue May 05 2020 - 09:56:18 EST


Since arch timer can be enabled at any time during boot, this patch
changes to invoke variant sched_clock_register_epoch() so it can
retrieve time offset prior to epoch (in nanosecond).

Arch timer driver doesn't directly use this time offset, but it needs to
pass this value to Perf framework to allow Perf tool to use it for
timestamp calibration. For this purpose, this patch introduces an API
arch_timer_get_epoch_offset() which returns the time offset for arch
timer's counter.

Signed-off-by: Leo Yan <leo.yan@xxxxxxxxxx>
---
drivers/clocksource/arm_arch_timer.c | 10 +++++++++-
include/clocksource/arm_arch_timer.h | 6 ++++++
2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
index 2204a444e801..10d0b15a7674 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -78,6 +78,8 @@ static enum vdso_clock_mode vdso_default = VDSO_CLOCKMODE_NONE;
static cpumask_t evtstrm_available = CPU_MASK_NONE;
static bool evtstrm_enable = IS_ENABLED(CONFIG_ARM_ARCH_TIMER_EVTSTREAM);

+static u64 epoch_offset;
+
static int __init early_evtstrm_cfg(char *buf)
{
return strtobool(buf, &evtstrm_enable);
@@ -942,6 +944,11 @@ u32 arch_timer_get_rate(void)
return arch_timer_rate;
}

+u64 arch_timer_get_epoch_offset(void)
+{
+ return epoch_offset;
+}
+
bool arch_timer_evtstrm_available(void)
{
/*
@@ -1009,7 +1016,8 @@ static void __init arch_counter_register(unsigned type)
&cyclecounter, start_count);

/* 56 bits minimum, so we assume worst case rollover */
- sched_clock_register(arch_timer_read_counter, 56, arch_timer_rate);
+ sched_clock_register_epoch(arch_timer_read_counter, 56,
+ arch_timer_rate, &epoch_offset);
}

static void arch_timer_stop(struct clock_event_device *clk)
diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h
index 1d68d5613dae..a566e82a40ba 100644
--- a/include/clocksource/arm_arch_timer.h
+++ b/include/clocksource/arm_arch_timer.h
@@ -83,6 +83,7 @@ struct arch_timer_mem {
#ifdef CONFIG_ARM_ARCH_TIMER

extern u32 arch_timer_get_rate(void);
+extern u64 arch_timer_get_epoch_offset(void);
extern u64 (*arch_timer_read_counter)(void);
extern struct arch_timer_kvm_info *arch_timer_get_kvm_info(void);
extern bool arch_timer_evtstrm_available(void);
@@ -94,6 +95,11 @@ static inline u32 arch_timer_get_rate(void)
return 0;
}

+static inline u64 arch_timer_get_epoch_offset(void)
+{
+ return 0;
+}
+
static inline u64 arch_timer_read_counter(void)
{
return 0;
--
2.17.1