| // SPDX-License-Identifier: GPL-2.0 |
| #include <linux/compiler.h> |
| #include <linux/types.h> |
| |
| #include "tsc.h" |
| |
| u64 perf_time_to_tsc(u64 ns, struct perf_tsc_conversion *tc) |
| { |
| u64 t, quot, rem; |
| |
| t = ns - tc->time_zero; |
| quot = t / tc->time_mult; |
| rem = t % tc->time_mult; |
| return (quot << tc->time_shift) + |
| (rem << tc->time_shift) / tc->time_mult; |
| } |
| |
| u64 tsc_to_perf_time(u64 cyc, struct perf_tsc_conversion *tc) |
| { |
| u64 quot, rem; |
| |
| quot = cyc >> tc->time_shift; |
| rem = cyc & (((u64)1 << tc->time_shift) - 1); |
| return tc->time_zero + quot * tc->time_mult + |
| ((rem * tc->time_mult) >> tc->time_shift); |
| } |
| |
| u64 __weak rdtsc(void) |
| { |
| return 0; |
| } |