From 5bb7a83a7a7bfc766426cfe57e9a66bb27eb6152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= Date: Mon, 6 Oct 2025 10:42:40 +0200 Subject: [PATCH] acpi/acpi_apic.c: Generate MADT LAPIC entries based on current mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-on: https://review.coreboot.org/c/coreboot/+/89475 Reviewed-by: Matt DeVillier Reviewed-by: Alicja Michalska Tested-by: build bot (Jenkins) --- src/acpi/acpi_apic.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/acpi/acpi_apic.c b/src/acpi/acpi_apic.c index 1862195e7f..355d3f9836 100644 --- a/src/acpi/acpi_apic.c +++ b/src/acpi/acpi_apic.c @@ -6,6 +6,7 @@ #include #include #include +#include #include static int acpi_create_madt_lapic(acpi_madt_lapic_t *lapic, u8 cpu, u8 apic) @@ -33,12 +34,12 @@ 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, - lapic_id); - else + if (is_x2apic_mode()) current += acpi_create_madt_lx2apic((acpi_madt_lx2apic_t *)current, index, lapic_id); + else + 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 */ - current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)current, - ACPI_MADT_LAPIC_NMI_ALL_PROCESSORS, flags, 1); - - if (!CONFIG(XAPIC_ONLY)) + 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); + return current; }