diff options
author | Arthur Heymans <arthur@aheymans.xyz> | 2018-08-02 13:21:57 +0200 |
---|---|---|
committer | Arthur Heymans <arthur@aheymans.xyz> | 2018-08-03 09:13:20 +0000 |
commit | b3587a60ab5ab7ec00b1632013de3ac8b0aabed6 (patch) | |
tree | 5b4639f749fa9ce523d1ed2db4e734879eea6d58 /src/cpu/x86/lapic | |
parent | 59962f3015055ccf746d286330a8ce4cc8edeccd (diff) |
cpu/x86/lapic/apic_timer.c: Compile the same code for all stages
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.
Change-Id: I08fd1795508f76abdab1618585366bf9d06482ff
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-on: https://review.coreboot.org/27801
Reviewed-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/cpu/x86/lapic')
-rw-r--r-- | src/cpu/x86/lapic/Makefile.inc | 1 | ||||
-rw-r--r-- | src/cpu/x86/lapic/apic_timer.c | 21 |
2 files changed, 13 insertions, 9 deletions
diff --git a/src/cpu/x86/lapic/Makefile.inc b/src/cpu/x86/lapic/Makefile.inc index e02dcdd3a2..9454f8f00a 100644 --- a/src/cpu/x86/lapic/Makefile.inc +++ b/src/cpu/x86/lapic/Makefile.inc @@ -3,6 +3,7 @@ ramstage-y += lapic_cpu_init.c ramstage-$(CONFIG_SMP) += secondary.S romstage-$(CONFIG_UDELAY_LAPIC) += apic_timer.c ramstage-$(CONFIG_UDELAY_LAPIC) += apic_timer.c +postcar-$(CONFIG_UDELAY_LAPIC) += apic_timer.c bootblock-y += boot_cpu.c verstage-y += boot_cpu.c romstage-y += boot_cpu.c diff --git a/src/cpu/x86/lapic/apic_timer.c b/src/cpu/x86/lapic/apic_timer.c index ec2e71c39e..e6a12ce387 100644 --- a/src/cpu/x86/lapic/apic_timer.c +++ b/src/cpu/x86/lapic/apic_timer.c @@ -138,22 +138,25 @@ void udelay(u32 usecs) } while ((start - value) < ticks); } -#if IS_ENABLED(CONFIG_LAPIC_MONOTONIC_TIMER) && !defined(__PRE_RAM__) +#if IS_ENABLED(CONFIG_LAPIC_MONOTONIC_TIMER) #include <timer.h> static struct monotonic_counter { int initialized; struct mono_time time; uint32_t last_value; -} mono_counter; +} mono_counter_g CAR_GLOBAL; void timer_monotonic_get(struct mono_time *mt) { uint32_t current_tick; uint32_t usecs_elapsed; uint32_t timer_fsb; + struct monotonic_counter *mono_counter; - if (!mono_counter.initialized) { + mono_counter = car_get_var_ptr(&mono_counter_g); + + if (!mono_counter->initialized) { init_timer(); timer_fsb = get_timer_fsb(); /* An FSB frequency of 200Mhz provides a 20 second polling @@ -163,22 +166,22 @@ void timer_monotonic_get(struct mono_time *mt) printk(BIOS_WARNING, "apic timer freq (%d) may be too fast.\n", timer_fsb); - mono_counter.last_value = lapic_read(LAPIC_TMCCT); - mono_counter.initialized = 1; + mono_counter->last_value = lapic_read(LAPIC_TMCCT); + mono_counter->initialized = 1; } timer_fsb = get_timer_fsb(); current_tick = lapic_read(LAPIC_TMCCT); /* Note that the APIC timer counts down. */ - usecs_elapsed = (mono_counter.last_value - current_tick) / timer_fsb; + usecs_elapsed = (mono_counter->last_value - current_tick) / timer_fsb; /* Update current time and tick values only if a full tick occurred. */ if (usecs_elapsed) { - mono_time_add_usecs(&mono_counter.time, usecs_elapsed); - mono_counter.last_value = current_tick; + mono_time_add_usecs(&mono_counter->time, usecs_elapsed); + mono_counter->last_value = current_tick; } /* Save result. */ - *mt = mono_counter.time; + *mt = mono_counter->time; } #endif |