From: Christopher Hall <christopher.s.hall@xxxxxxxxx> Add a function to 'read' the ART(Always Running Timer) value using TSC(Time Stamp Capture) conversion. The Intel PMC Timed I/O driver requires the current ART value to test for rollover. Signed-off-by: Christopher Hall <christopher.s.hall@xxxxxxxxx> Signed-off-by: Tamal Saha <tamal.saha@xxxxxxxxx> Co-developed-by: Lakshmi Sowjanya D <lakshmi.sowjanya.d@xxxxxxxxx> Signed-off-by: Lakshmi Sowjanya D <lakshmi.sowjanya.d@xxxxxxxxx> Reviewed-by: Mark Gross <mgross@xxxxxxxxxxxxxxx> --- arch/x86/include/asm/tsc.h | 1 + arch/x86/kernel/tsc.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h index 01a300a9700b..a50b0102e5c1 100644 --- a/arch/x86/include/asm/tsc.h +++ b/arch/x86/include/asm/tsc.h @@ -28,6 +28,7 @@ static inline cycles_t get_cycles(void) return rdtsc(); } +extern u64 read_art_time(void); extern struct system_counterval_t convert_art_to_tsc(u64 art); extern struct system_counterval_t convert_art_ns_to_tsc(u64 art_ns); diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 2e076a459a0c..bbab6cf1a73b 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -1230,6 +1230,26 @@ int unsynchronized_tsc(void) return 0; } +/* + * Converts the current TSC to the current ART value using conversion + * factors discovered by detect_art() + */ +u64 read_art_time(void) +{ + u64 tsc, tmp, res, rem; + + tsc = read_tsc(NULL) - art_to_tsc_offset; + rem = do_div(tsc, art_to_tsc_numerator); + + res = tsc * art_to_tsc_denominator; + tmp = rem * art_to_tsc_denominator; + + do_div(tmp, art_to_tsc_numerator); + + return res + tmp; +} +EXPORT_SYMBOL(read_art_time); + /* * Convert ART to TSC given numerator/denominator found in detect_art() */ -- 2.17.1