Skip to content

Commit

Permalink
time: Add cycles to nanoseconds translation
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Richard Cochran <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Reviewed-by: Thomas Gleixner <[email protected]>
Signed-off-by: Christopher S. Hall <[email protected]>
Signed-off-by: John Stultz <[email protected]>
  • Loading branch information
christopher-s-hall authored and johnstultz-work committed Mar 3, 2016
1 parent 232d263 commit 6bd58f0
Showing 1 changed file with 21 additions and 4 deletions.
25 changes: 21 additions & 4 deletions kernel/time/timekeeping.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,17 +298,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);
}

/**
Expand Down

0 comments on commit 6bd58f0

Please sign in to comment.