cpu/x86/lapic: Add Kconfig choice LAPIC_ACCESS_MODE

Allows compile-time optimisation on platforms that do not wish
to enable runtime checking of X2APIC.

Legacy lapic_cpu_init() is incompatible so there is dependency
on PARALLEL_MP. Also stop_this_cpu() is incompatible, so there
is dependency on !AP_IN_SIPI_WAIT.

Since the code actually lacks enablement of X2APIC (apparently
assuming the blob has done it) and the other small flaws pointed
out in earlier reviews, X2APIC_RUNTIME is not selected per
default on any platform yet.

Change-Id: I8269f9639ee3e89a2c2b4178d266ba2dac46db3f
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/55073
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Wonkyu Kim <wonkyu.kim@intel.com>
This commit is contained in:
Kyösti Mälkki 2021-05-29 20:33:22 +03:00 committed by Patrick Georgi
parent 4cf65e9cc3
commit 176c8877ce
3 changed files with 32 additions and 0 deletions

View File

@ -17,6 +17,28 @@ config PARALLEL_MP_AP_WORK
config LEGACY_SMP_INIT config LEGACY_SMP_INIT
bool bool
choice LAPIC_ACCESS_MODE
prompt "APIC operation mode"
default XAPIC_ONLY
config XAPIC_ONLY
prompt "Set XAPIC mode"
bool
config X2APIC_ONLY
prompt "Set X2APIC mode"
bool
depends on PARALLEL_MP
depends on !AP_IN_SIPI_WAIT
config X2APIC_RUNTIME
prompt "Support both XAPIC and X2APIC"
bool
depends on PARALLEL_MP
depends on !AP_IN_SIPI_WAIT
endchoice
config UDELAY_LAPIC config UDELAY_LAPIC
bool bool
default n default n

View File

@ -3,6 +3,10 @@
#include <cpu/x86/lapic.h> #include <cpu/x86/lapic.h>
#include <console/console.h> #include <console/console.h>
#if !CONFIG(XAPIC_ONLY)
#error "BUG: lapic_write_around() needs to be fixed for X2APIC."
#endif
void lapic_virtual_wire_mode_init(void) void lapic_virtual_wire_mode_init(void)
{ {
/* this is so interrupts work. This is very limited scope -- /* this is so interrupts work. This is very limited scope --

View File

@ -10,6 +10,12 @@
static inline bool is_x2apic_mode(void) static inline bool is_x2apic_mode(void)
{ {
if (CONFIG(XAPIC_ONLY))
return false;
if (CONFIG(X2APIC_ONLY))
return true;
msr_t msr; msr_t msr;
msr = rdmsr(LAPIC_BASE_MSR); msr = rdmsr(LAPIC_BASE_MSR);
return ((msr.lo & LAPIC_BASE_X2APIC_ENABLED) == LAPIC_BASE_X2APIC_ENABLED); return ((msr.lo & LAPIC_BASE_X2APIC_ENABLED) == LAPIC_BASE_X2APIC_ENABLED);