summaryrefslogtreecommitdiff
path: root/src/cpu/x86/tsc
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2016-04-08 21:28:11 -0500
committerMartin Roth <martinroth@google.com>2016-04-11 16:14:46 +0200
commit01dfdc5369de3899731982a015ce708184552ac6 (patch)
tree5fe41283b1f0de1230da962d43bc0331a37abd30 /src/cpu/x86/tsc
parent711bfa97108989d8c273315ceae6b3d8351c4ac6 (diff)
cpu/x86/tsc: compile same code for all stages
The delay_tsc.c code took different paths depending __PRE_RAM__ being defined or not. Also, timer_monotonic_get() was only compiled in a !__PRE_RAM__ environment. Clean up the code paths by employing CAR_GLOBAL for the global state which allows the same code to be used in all stages. Lastly, handle apollolake fallout now that init_timer() is not needed in placeholders.c. Change-Id: Ia769fa71e2c9d8b11201a3896d117097f2cb7c56 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://review.coreboot.org/14301 Tested-by: build bot (Jenkins) Reviewed-by: Furquan Shaikh <furquan@google.com> Reviewed-by: Andrey Petrov <andrey.petrov@intel.com>
Diffstat (limited to 'src/cpu/x86/tsc')
-rw-r--r--src/cpu/x86/tsc/delay_tsc.c24
1 files changed, 8 insertions, 16 deletions
diff --git a/src/cpu/x86/tsc/delay_tsc.c b/src/cpu/x86/tsc/delay_tsc.c
index 1aec472523..439b477283 100644
--- a/src/cpu/x86/tsc/delay_tsc.c
+++ b/src/cpu/x86/tsc/delay_tsc.c
@@ -1,3 +1,4 @@
+#include <arch/early_variables.h>
#include <console/console.h>
#include <arch/io.h>
#include <cpu/x86/msr.h>
@@ -6,9 +7,7 @@
#include <delay.h>
#include <thread.h>
-#if !defined(__PRE_RAM__)
-
-static unsigned long clocks_per_usec;
+static unsigned long clocks_per_usec CAR_GLOBAL;
#if CONFIG_TSC_CONSTANT_RATE
static unsigned long calibrate_tsc(void)
@@ -94,22 +93,15 @@ bad_ctc:
void init_timer(void)
{
- if (!clocks_per_usec)
- clocks_per_usec = calibrate_tsc();
+ 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 clocks_per_usec;
-}
-#else /* !defined(__PRE_RAM__) */
-/* romstage calls into cpu/board specific function every time. */
-static inline unsigned long get_clocks_per_usec(void)
-{
- return tsc_freq_mhz();
+ return car_get_var(clocks_per_usec);
}
-#endif /* !defined(__PRE_RAM__) */
void udelay(unsigned us)
{
@@ -130,18 +122,18 @@ void udelay(unsigned us)
}
}
-#if CONFIG_TSC_MONOTONIC_TIMER && !defined(__PRE_RAM__)
+#if CONFIG_TSC_MONOTONIC_TIMER
#include <timer.h>
static struct monotonic_counter {
int initialized;
struct mono_time time;
uint64_t last_value;
-} mono_counter_g;
+} mono_counter_g CAR_GLOBAL;
static inline struct monotonic_counter *get_monotonic_context(void)
{
- return &mono_counter_g;
+ return car_get_var_ptr(&mono_counter_g);
}
void timer_monotonic_get(struct mono_time *mt)