@@ -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)
@@ -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;
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@linaro.org> --- drivers/clocksource/arm_arch_timer.c | 10 +++++++++- include/clocksource/arm_arch_timer.h | 6 ++++++ 2 files changed, 15 insertions(+), 1 deletion(-)