blob: bd1e4e7aac9f1b6a7bfa5e35ce8563a86ee6ad32 [file] [log] [blame]
Felix Held4a8cd722020-04-18 22:26:39 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Aaron Durbin24079322018-01-23 10:53:05 -07002
3#include <cpu/x86/msr.h>
4#include <timer.h>
Aaron Durbin51e4c1a2018-01-24 17:42:51 -07005#include <timestamp.h>
Aaron Durbin24079322018-01-23 10:53:05 -07006
7#define CU_PTSC_MSR 0xc0010280
8#define PTSC_FREQ_MHZ 100
9
10void timer_monotonic_get(struct mono_time *mt)
11{
Aaron Durbin51e4c1a2018-01-24 17:42:51 -070012 mono_time_set_usecs(mt, timestamp_get());
13}
14
Felix Heldc08d8042023-03-24 22:07:48 +010015/* The TSC has a non-constant rate before the microcode update is applied, so it can't be used
16 in timestamp_get before that. Instead, the Performance Time Stamp Counter is used. */
Aaron Durbin51e4c1a2018-01-24 17:42:51 -070017uint64_t timestamp_get(void)
18{
Aaron Durbin24079322018-01-23 10:53:05 -070019 msr_t msr;
20
21 msr = rdmsr(CU_PTSC_MSR);
22
Felix Held2c982182023-03-09 19:28:16 +010023 return msr.raw / PTSC_FREQ_MHZ;
Aaron Durbin24079322018-01-23 10:53:05 -070024}