summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cpu/x86/Kconfig22
-rw-r--r--src/cpu/x86/lapic/lapic.c4
-rw-r--r--src/include/cpu/x86/lapic.h6
3 files changed, 32 insertions, 0 deletions
diff --git a/src/cpu/x86/Kconfig b/src/cpu/x86/Kconfig
index 7aba5c4658..d7057ad861 100644
--- a/src/cpu/x86/Kconfig
+++ b/src/cpu/x86/Kconfig
@@ -17,6 +17,28 @@ config PARALLEL_MP_AP_WORK
config LEGACY_SMP_INIT
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
bool
default n
diff --git a/src/cpu/x86/lapic/lapic.c b/src/cpu/x86/lapic/lapic.c
index a5b4cd5047..09dd00397e 100644
--- a/src/cpu/x86/lapic/lapic.c
+++ b/src/cpu/x86/lapic/lapic.c
@@ -3,6 +3,10 @@
#include <cpu/x86/lapic.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)
{
/* this is so interrupts work. This is very limited scope --
diff --git a/src/include/cpu/x86/lapic.h b/src/include/cpu/x86/lapic.h
index ab2843f69a..2de5dd57df 100644
--- a/src/include/cpu/x86/lapic.h
+++ b/src/include/cpu/x86/lapic.h
@@ -10,6 +10,12 @@
static inline bool is_x2apic_mode(void)
{
+ if (CONFIG(XAPIC_ONLY))
+ return false;
+
+ if (CONFIG(X2APIC_ONLY))
+ return true;
+
msr_t msr;
msr = rdmsr(LAPIC_BASE_MSR);
return ((msr.lo & LAPIC_BASE_X2APIC_ENABLED) == LAPIC_BASE_X2APIC_ENABLED);