[linux-yocto] [PATCH 2/6] time: Add cycles to nanoseconds translation

jonathan.yong at intel.com jonathan.yong at intel.com
Mon Jun 13 00:07:53 PDT 2016


From: "Christopher S. Hall" <christopher.s.hall at intel.com>

The timekeeping code does not currently provide a way to translate
externally provided clocksource cycles to system time. The cycle count
is always provided by the result clocksource read() method internal to
the timekeeping code. The added function timekeeping_cycles_to_ns()
calculated a nanosecond value from a cycle count that can be added to
tk_read_base.base value yielding the current system time. This allows
clocksource cycle values external to the timekeeping code to provide a
cycle count that can be transformed to system time.

Cc: Prarit Bhargava <prarit at redhat.com>
Cc: Richard Cochran <richardcochran at gmail.com>
Cc: Thomas Gleixner <tglx at linutronix.de>
Cc: Ingo Molnar <mingo at kernel.org>
Cc: Andy Lutomirski <luto at amacapital.net>
Cc: kevin.b.stanton at intel.com
Cc: kevin.j.clarke at intel.com
Cc: hpa at zytor.com
Cc: jeffrey.t.kirsher at intel.com
Cc: netdev at vger.kernel.org
Reviewed-by: Thomas Gleixner <tglx at linutronix.de>
Signed-off-by: Christopher S. Hall <christopher.s.hall at intel.com>
Signed-off-by: John Stultz <john.stultz at linaro.org>
(cherry picked from commit 6bd58f09e1d8cc6c50a824c00bf0d617919986a1)
Signed-off-by: Yong, Jonathan <jonathan.yong at intel.com>
---
 kernel/time/timekeeping.c | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index a59a282..80ed299 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -309,17 +309,34 @@ u32 (*arch_gettimeoffset)(void) = default_arch_gettimeoffset;
 static inline u32 arch_gettimeoffset(void) { return 0; }
 #endif
 
+static inline s64 timekeeping_delta_to_ns(struct tk_read_base *tkr,
+					  cycle_t delta)
+{
+	s64 nsec;
+
+	nsec = delta * tkr->mult + tkr->xtime_nsec;
+	nsec >>= tkr->shift;
+
+	/* If arch requires, add in get_arch_timeoffset() */
+	return nsec + arch_gettimeoffset();
+}
+
 static inline s64 timekeeping_get_ns(struct tk_read_base *tkr)
 {
 	cycle_t delta;
-	s64 nsec;
 
 	delta = timekeeping_get_delta(tkr);
+	return timekeeping_delta_to_ns(tkr, delta);
+}
 
-	nsec = (delta * tkr->mult + tkr->xtime_nsec) >> tkr->shift;
+static inline s64 timekeeping_cycles_to_ns(struct tk_read_base *tkr,
+					    cycle_t cycles)
+{
+	cycle_t delta;
 
-	/* If arch requires, add in get_arch_timeoffset() */
-	return nsec + arch_gettimeoffset();
+	/* calculate the delta since the last update_wall_time */
+	delta = clocksource_delta(cycles, tkr->cycle_last, tkr->mask);
+	return timekeeping_delta_to_ns(tkr, delta);
 }
 
 /**
-- 
2.7.3



More information about the linux-yocto mailing list