acpi/acpi_apic.c: Generate MADT LAPIC entries based on current mode

Depending on the Kconfig, LAPIC may be in either xAPIC or x2APIC mode.
However, coreboot generates MADT LAPIC entries based on APIC ID rather
than currently enabled LAPIC mode. This resulted in LAPICs enabled in
x2APIC mode being described as xAPICs in MADT.

Create appropriate MADT LAPIC entries based on currently enabled mode
by calling is_x2apic_mode.

TEST=MADT describes LAPICs in x2APIC mode on Gigabyte MZ33-AR1, matching
the actually enabled LAPIC mode.

Change-Id: Iebbbca415f0b775339cbfab5c24848940d92878d
Signed-off-by: Michał Żygowski <michal.zygowski@3mdeb.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/89475
Reviewed-by: Matt DeVillier <matt.devillier@gmail.com>
Reviewed-by: Alicja Michalska <ahplka19@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Michał Żygowski 2025-10-06 10:42:40 +02:00 committed by Matt DeVillier
commit 5bb7a83a7a

View file

@ -6,6 +6,7 @@
#include <arch/smp/mpspec.h>
#include <commonlib/sort.h>
#include <cpu/cpu.h>
#include <cpu/x86/lapic.h>
#include <device/device.h>
static int acpi_create_madt_lapic(acpi_madt_lapic_t *lapic, u8 cpu, u8 apic)
@ -33,11 +34,11 @@ static int acpi_create_madt_lx2apic(acpi_madt_lx2apic_t *lapic, u32 cpu, u32 api
unsigned long acpi_create_madt_one_lapic(unsigned long current, u32 index, u32 lapic_id)
{
if (lapic_id <= ACPI_MADT_MAX_LAPIC_ID)
current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, index,
if (is_x2apic_mode())
current += acpi_create_madt_lx2apic((acpi_madt_lx2apic_t *)current, index,
lapic_id);
else
current += acpi_create_madt_lx2apic((acpi_madt_lx2apic_t *)current, index,
current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, index,
lapic_id);
return current;
@ -181,12 +182,13 @@ unsigned long acpi_create_madt_lapic_nmis(unsigned long current)
/* 1: LINT1 connect to NMI */
/* create all subtables for processors */
if (is_x2apic_mode())
current += acpi_create_madt_lx2apic_nmi((acpi_madt_lx2apic_nmi_t *)current,
ACPI_MADT_LX2APIC_NMI_ALL_PROCESSORS, flags, 1);
else
current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)current,
ACPI_MADT_LAPIC_NMI_ALL_PROCESSORS, flags, 1);
if (!CONFIG(XAPIC_ONLY))
current += acpi_create_madt_lx2apic_nmi((acpi_madt_lx2apic_nmi_t *)current,
ACPI_MADT_LX2APIC_NMI_ALL_PROCESSORS, flags, 1);
return current;
}