ACPI: Add COMMON_ACPI_MADT_IOAPIC and CUSTOM_ACPI_MADT

Add Kconfig COMMON_ACPI_MADT_IOAPIC to replace platforms'
implementations of adding IOAPIC and IRQ override entries
for ACPI MADT tables.

Platforms that have a more complex MADT may continue to
add custom entries using CUSTOM_ACPI_MADT.

Change-Id: I0b77769f89cc319ad228eb37bc341e2150b8a892
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/74348
Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
diff --git a/src/acpi/Kconfig b/src/acpi/Kconfig
index 5af8b22..3b02070 100644
--- a/src/acpi/Kconfig
+++ b/src/acpi/Kconfig
@@ -31,13 +31,22 @@
 	  Set to indicate <soc/nvs.h> exists for the platform with a definition
 	  for global_nvs.
 
+config ACPI_CUSTOM_MADT
+	bool
+	default n if ACPI_NO_CUSTOM_MADT
+	default y
+	help
+	  Selected by platforms that need to expose custom MADT entries.
+
+config ACPI_NO_CUSTOM_MADT
+	bool
+	default y if ACPI_COMMON_MADT_LAPIC && ACPI_COMMON_MADT_IOAPIC
+
 config ACPI_COMMON_MADT_LAPIC
 	bool
 
-config ACPI_NO_MADT
+config ACPI_COMMON_MADT_IOAPIC
 	bool
-	help
-	  Selected by platforms that don't expose a useful MADT.
 
 config ACPI_NO_PCAT_8259
 	bool
diff --git a/src/acpi/acpi.c b/src/acpi/acpi.c
index c357e2b..e06ac47 100644
--- a/src/acpi/acpi.c
+++ b/src/acpi/acpi.c
@@ -276,6 +276,18 @@
 	return irqoverride->length;
 }
 
+static unsigned long acpi_create_madt_ioapic_gsi0_default(unsigned long current)
+{
+	current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, IO_APIC_ADDR);
+
+	current += acpi_create_madt_irqoverride((void *)current, MP_BUS_ISA, 0, 2,
+						MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH);
+
+	current += acpi_create_madt_sci_override((void *)current);
+
+	return current;
+}
+
 static int acpi_create_madt_lapic_nmi(acpi_madt_lapic_nmi_t *lapic_nmi, u8 cpu,
 				u16 flags, u8 lint)
 {
@@ -353,7 +365,10 @@
 	if (CONFIG(ACPI_COMMON_MADT_LAPIC))
 		current = acpi_create_madt_lapics_with_nmis(current);
 
-	if (!CONFIG(ACPI_NO_MADT))
+	if (CONFIG(ACPI_COMMON_MADT_IOAPIC))
+		current = acpi_create_madt_ioapic_gsi0_default(current);
+
+	if (CONFIG(ACPI_CUSTOM_MADT))
 		current = acpi_fill_madt(current);
 
 	/* (Re)calculate length and checksum. */