diff options
author | Aaron Durbin <adurbin@chromium.org> | 2016-04-08 21:28:11 -0500 |
---|---|---|
committer | Martin Roth <martinroth@google.com> | 2016-04-11 16:14:46 +0200 |
commit | 01dfdc5369de3899731982a015ce708184552ac6 (patch) | |
tree | 5fe41283b1f0de1230da962d43bc0331a37abd30 /src/cpu/x86/tsc | |
parent | 711bfa97108989d8c273315ceae6b3d8351c4ac6 (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.c | 24 |
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) |