Kyösti Mälkki has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/55261 )
Change subject: cpu/x86/lapic: Split virtual_wire_mode_init() ......................................................................
cpu/x86/lapic: Split virtual_wire_mode_init()
Only the enable_lapic() part is required while doing SMP init. Also disable_lapic() must not be called if we relay on LAPIC for timer source.
Change-Id: Ib5e37c1a0a91fa4e9542141aa74f1c1876fee94e Signed-off-by: Kyösti Mälkki kyosti.malkki@gmail.com --- M src/cpu/x86/lapic/lapic.c 1 file changed, 13 insertions(+), 17 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/61/55261/1
diff --git a/src/cpu/x86/lapic/lapic.c b/src/cpu/x86/lapic/lapic.c index 9aac163..9d1684b 100644 --- a/src/cpu/x86/lapic/lapic.c +++ b/src/cpu/x86/lapic/lapic.c @@ -10,12 +10,17 @@ void enable_lapic(void) { msr_t msr; + msr = rdmsr(LAPIC_BASE_MSR); msr.hi &= 0xffffff00; msr.lo &= ~LAPIC_BASE_MSR_ADDR_MASK; msr.lo |= LAPIC_DEFAULT_BASE; msr.lo |= LAPIC_BASE_MSR_ENABLE; wrmsr(LAPIC_BASE_MSR, msr); + + printk(BIOS_INFO, "Setting up local APIC...\n"); + printk(BIOS_DEBUG, " apic_id: 0x%x ", lapicid()); + printk(BIOS_INFO, "done.\n"); }
void disable_lapic(void) @@ -39,19 +44,6 @@
static void lapic_virtual_wire_mode_init(void) { - /* this is so interrupts work. This is very limited scope -- - * linux will do better later, we hope ... - */ - /* this is the first way we learned to do it. It fails on real SMP - * stuff. So we have to do things differently ... - * see the Intel mp1.4 spec, page A-3 - */ - - printk(BIOS_INFO, "Setting up local APIC...\n"); - - /* Enable the local APIC */ - enable_lapic(); - /* * Set Task Priority to 'accept all'. */ @@ -70,14 +62,18 @@ lapic_update32(LAPIC_LVT1, ~mask, LAPIC_LVT_REMOTE_IRR | LAPIC_SEND_PENDING | LAPIC_DELIVERY_MODE_NMI);
- printk(BIOS_DEBUG, " apic_id: 0x%x ", lapicid()); - printk(BIOS_INFO, "done.\n"); }
void setup_lapic(void) { + /* Enable the local APIC */ + if (need_lapic_init()) { + enable_lapic(); + } else if (!CONFIG(UDELAY_LAPIC)) + disable_lapic(); + + /* This programming is for PIC mode i8259 interrupts to be delivered to CPU + * while LAPIC is enabled. */ if (need_lapic_init()) lapic_virtual_wire_mode_init(); - else - disable_lapic(); }