summaryrefslogtreecommitdiff
path: root/src/cpu/x86
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/x86')
-rw-r--r--src/cpu/x86/Kconfig9
-rw-r--r--src/cpu/x86/tsc/Makefile.inc8
-rw-r--r--src/cpu/x86/tsc/delay_tsc.c23
3 files changed, 10 insertions, 30 deletions
diff --git a/src/cpu/x86/Kconfig b/src/cpu/x86/Kconfig
index b316c1ffc3..85ebd831ea 100644
--- a/src/cpu/x86/Kconfig
+++ b/src/cpu/x86/Kconfig
@@ -34,12 +34,9 @@ config UDELAY_TSC
bool
default n
-config TSC_CONSTANT_RATE
- def_bool n
- depends on UDELAY_TSC
- help
- This option asserts that the TSC ticks at a known constant rate.
- Therefore, no TSC calibration is required.
+config UNKNOWN_TSC_RATE
+ bool
+ default y if LAPIC_MONOTONIC_TIMER
config TSC_MONOTONIC_TIMER
def_bool n
diff --git a/src/cpu/x86/tsc/Makefile.inc b/src/cpu/x86/tsc/Makefile.inc
index ab7453f262..b3925b5051 100644
--- a/src/cpu/x86/tsc/Makefile.inc
+++ b/src/cpu/x86/tsc/Makefile.inc
@@ -1,6 +1,6 @@
bootblock-$(CONFIG_UDELAY_TSC) += delay_tsc.c
ramstage-$(CONFIG_UDELAY_TSC) += delay_tsc.c
-romstage-$(CONFIG_TSC_CONSTANT_RATE) += delay_tsc.c
-verstage-$(CONFIG_TSC_CONSTANT_RATE) += delay_tsc.c
-postcar-$(CONFIG_TSC_CONSTANT_RATE) += delay_tsc.c
-smm-$(CONFIG_TSC_CONSTANT_RATE) += delay_tsc.c
+romstage-$(CONFIG_UDELAY_TSC) += delay_tsc.c
+verstage-$(CONFIG_UDELAY_TSC) += delay_tsc.c
+postcar-$(CONFIG_UDELAY_TSC) += delay_tsc.c
+smm-$(CONFIG_UDELAY_TSC) += delay_tsc.c
diff --git a/src/cpu/x86/tsc/delay_tsc.c b/src/cpu/x86/tsc/delay_tsc.c
index afcd1d1f7d..7aa887ae63 100644
--- a/src/cpu/x86/tsc/delay_tsc.c
+++ b/src/cpu/x86/tsc/delay_tsc.c
@@ -18,26 +18,9 @@
#include <delay.h>
#include <thread.h>
-static unsigned long clocks_per_usec CAR_GLOBAL;
-
-static unsigned long calibrate_tsc(void)
-{
- if (CONFIG(TSC_CONSTANT_RATE))
- return tsc_freq_mhz();
- else
- return calibrate_tsc_with_pit();
-}
-
void init_timer(void)
{
- if (!car_get_var(clocks_per_usec))
- car_set_var(clocks_per_usec, calibrate_tsc());
-}
-
-static inline unsigned long get_clocks_per_usec(void)
-{
- init_timer();
- return car_get_var(clocks_per_usec);
+ (void)tsc_freq_mhz();
}
void udelay(unsigned int us)
@@ -51,7 +34,7 @@ void udelay(unsigned int us)
start = rdtscll();
clocks = us;
- clocks *= get_clocks_per_usec();
+ clocks *= tsc_freq_mhz();
current = rdtscll();
while ((current - start) < clocks) {
cpu_relax();
@@ -89,7 +72,7 @@ void timer_monotonic_get(struct mono_time *mt)
current_tick = rdtscll();
ticks_elapsed = current_tick - mono_counter->last_value;
- ticks_per_usec = get_clocks_per_usec();
+ ticks_per_usec = tsc_freq_mhz();
/* Update current time and tick values only if a full tick occurred. */
if (ticks_elapsed >= ticks_per_usec) {