Revert "cpu/x86/lapic: Unconditionally use CPUID leaf 0xb if available"

This reverts commit ceaf959678.

The AMD Picasso SoC doesn't support x2APIC and neither advertises the
presence of its support via bit 21 in EAX of CPUID leaf 1 nor has the
bit 10 in the APIC base address MSR 0x1b set, but it does have 0xd CPUID
leaves, so just checking for the presence of that CPUID leaf isn't
sufficient to be sure that EDX of the CPUID leaf 0xb will contain a
valid APIC ID.

In the case of Picasso EDX of the CPUID leaf 0xb returns 0 for all cores
which causes coreboot to get stuck somewhere at the end of MP init.

I'm not 100% sure if we should additionally check bit 21 in EAX of CPUID
function 1 is set instead of adding back the is_x2apic_mode check.

TEST=Mandolin with a Picasso SoC boots again.

Signed-off-by: Felix Held <felix-coreboot@felixheld.de>
Change-Id: If1e3c55ce2d048b14c08e06bb79810179a87993d
Reviewed-on: https://review.coreboot.org/c/coreboot/+/61776
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Raul Rangel <rrangel@chromium.org>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Reviewed-by: Christian Walter <christian.walter@9elements.com>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
This commit is contained in:
Felix Held 2022-02-09 22:07:29 +01:00 committed by Kyösti Mälkki
parent ecdc714ef8
commit 49be1a9346
2 changed files with 13 additions and 8 deletions

View File

@ -101,25 +101,30 @@ smm_trampoline32:
* the OS can manipulate the APIC id use the non-changing cpuid result * the OS can manipulate the APIC id use the non-changing cpuid result
* for APIC id (eax). A table is used to handle a discontiguous * for APIC id (eax). A table is used to handle a discontiguous
* APIC id space. */ * APIC id space. */
apic_id:
mov $LAPIC_BASE_MSR, %ecx
rdmsr
and $LAPIC_BASE_X2APIC_ENABLED, %eax
cmp $LAPIC_BASE_X2APIC_ENABLED, %eax
jne xapic
mov $0, %eax x2apic:
cpuid
cmp $0xb, %eax
jc 1f
mov $0xb, %eax mov $0xb, %eax
mov $0, %ecx mov $0, %ecx
cpuid cpuid
mov %edx, %eax mov %edx, %eax
jmp 2f jmp apicid_end
1:
xapic:
mov $1, %eax mov $1, %eax
cpuid cpuid
mov %ebx, %eax mov %ebx, %eax
shr $24, %eax shr $24, %eax
2:
apicid_end:
mov $(apic_to_cpu_num), %ebx mov $(apic_to_cpu_num), %ebx
xor %ecx, %ecx xor %ecx, %ecx
1: 1:
cmp (%ebx, %ecx, 2), %ax cmp (%ebx, %ecx, 2), %ax
je 1f je 1f

View File

@ -126,7 +126,7 @@ static __always_inline int lapic_busy(void)
static __always_inline unsigned int initial_lapicid(void) static __always_inline unsigned int initial_lapicid(void)
{ {
uint32_t lapicid; uint32_t lapicid;
if (cpuid_get_max_func() >= 0xb) if (is_x2apic_mode() && cpuid_get_max_func() >= 0xb)
lapicid = cpuid_ext(0xb, 0).edx; lapicid = cpuid_ext(0xb, 0).edx;
else else
lapicid = cpuid_ebx(1) >> 24; lapicid = cpuid_ebx(1) >> 24;