Merge branch 'x86-timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 timer updates from Ingo Molnar: "Two changes: add the new convert_art_ns_to_tsc() API for upcoming Intel Goldmont+ drivers, and remove the obsolete rdtscll() API" * 'x86-timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/tsc: Get rid of rdtscll() x86/tsc: Convert ART in nanoseconds to TSC
This commit is contained in:
commit
a5532439eb
@ -188,10 +188,11 @@ static inline u64 msr_read_counter(struct perf_event *event)
|
|||||||
if (event->hw.event_base)
|
if (event->hw.event_base)
|
||||||
rdmsrl(event->hw.event_base, now);
|
rdmsrl(event->hw.event_base, now);
|
||||||
else
|
else
|
||||||
rdtscll(now);
|
now = rdtsc_ordered();
|
||||||
|
|
||||||
return now;
|
return now;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void msr_event_update(struct perf_event *event)
|
static void msr_event_update(struct perf_event *event)
|
||||||
{
|
{
|
||||||
u64 prev, now;
|
u64 prev, now;
|
||||||
|
@ -232,9 +232,6 @@ static __always_inline unsigned long long rdtsc_ordered(void)
|
|||||||
return rdtsc();
|
return rdtsc();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deprecated, keep it for a cycle for easier merging: */
|
|
||||||
#define rdtscll(now) do { (now) = rdtsc_ordered(); } while (0)
|
|
||||||
|
|
||||||
static inline unsigned long long native_read_pmc(int counter)
|
static inline unsigned long long native_read_pmc(int counter)
|
||||||
{
|
{
|
||||||
DECLARE_ARGS(val, low, high);
|
DECLARE_ARGS(val, low, high);
|
||||||
|
@ -31,6 +31,7 @@ static inline cycles_t get_cycles(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
extern struct system_counterval_t convert_art_to_tsc(u64 art);
|
extern struct system_counterval_t convert_art_to_tsc(u64 art);
|
||||||
|
extern struct system_counterval_t convert_art_ns_to_tsc(u64 art_ns);
|
||||||
|
|
||||||
extern void tsc_early_delay_calibrate(void);
|
extern void tsc_early_delay_calibrate(void);
|
||||||
extern void tsc_init(void);
|
extern void tsc_init(void);
|
||||||
|
@ -491,7 +491,7 @@ static void do_inject(void)
|
|||||||
unsigned int cpu = i_mce.extcpu;
|
unsigned int cpu = i_mce.extcpu;
|
||||||
u8 b = i_mce.bank;
|
u8 b = i_mce.bank;
|
||||||
|
|
||||||
rdtscll(i_mce.tsc);
|
i_mce.tsc = rdtsc_ordered();
|
||||||
|
|
||||||
if (i_mce.misc)
|
if (i_mce.misc)
|
||||||
i_mce.status |= MCI_STATUS_MISCV;
|
i_mce.status |= MCI_STATUS_MISCV;
|
||||||
|
@ -1179,6 +1179,45 @@ struct system_counterval_t convert_art_to_tsc(u64 art)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(convert_art_to_tsc);
|
EXPORT_SYMBOL(convert_art_to_tsc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* convert_art_ns_to_tsc() - Convert ART in nanoseconds to TSC.
|
||||||
|
* @art_ns: ART (Always Running Timer) in unit of nanoseconds
|
||||||
|
*
|
||||||
|
* PTM requires all timestamps to be in units of nanoseconds. When user
|
||||||
|
* software requests a cross-timestamp, this function converts system timestamp
|
||||||
|
* to TSC.
|
||||||
|
*
|
||||||
|
* This is valid when CPU feature flag X86_FEATURE_TSC_KNOWN_FREQ is set
|
||||||
|
* indicating the tsc_khz is derived from CPUID[15H]. Drivers should check
|
||||||
|
* that this flag is set before conversion to TSC is attempted.
|
||||||
|
*
|
||||||
|
* Return:
|
||||||
|
* struct system_counterval_t - system counter value with the pointer to the
|
||||||
|
* corresponding clocksource
|
||||||
|
* @cycles: System counter value
|
||||||
|
* @cs: Clocksource corresponding to system counter value. Used
|
||||||
|
* by timekeeping code to verify comparibility of two cycle
|
||||||
|
* values.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct system_counterval_t convert_art_ns_to_tsc(u64 art_ns)
|
||||||
|
{
|
||||||
|
u64 tmp, res, rem;
|
||||||
|
|
||||||
|
rem = do_div(art_ns, USEC_PER_SEC);
|
||||||
|
|
||||||
|
res = art_ns * tsc_khz;
|
||||||
|
tmp = rem * tsc_khz;
|
||||||
|
|
||||||
|
do_div(tmp, USEC_PER_SEC);
|
||||||
|
res += tmp;
|
||||||
|
|
||||||
|
return (struct system_counterval_t) { .cs = art_related_clocksource,
|
||||||
|
.cycles = res};
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(convert_art_ns_to_tsc);
|
||||||
|
|
||||||
|
|
||||||
static void tsc_refine_calibration_work(struct work_struct *work);
|
static void tsc_refine_calibration_work(struct work_struct *work);
|
||||||
static DECLARE_DELAYED_WORK(tsc_irqwork, tsc_refine_calibration_work);
|
static DECLARE_DELAYED_WORK(tsc_irqwork, tsc_refine_calibration_work);
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user