soc/intel/common/block/acpi: Add soc MADT IOAPIC hook

Add a hook for SOCs to provide an IOAPIC MADT table. If the
SOC doesn't provide a table then a standard setting is used.

Change-Id: Ic818a634e4912d88ef93971deb4da5ab708c9020
Signed-off-by: Marc Jones <marcjones@sysproconsulting.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/48246
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Jay Talbott <JayTalbott@sysproconsulting.com>
Reviewed-by: Furquan Shaikh <furquan@google.com>
diff --git a/src/soc/intel/common/block/acpi/acpi.c b/src/soc/intel/common/block/acpi/acpi.c
index a6c626f..934a92f7 100644
--- a/src/soc/intel/common/block/acpi/acpi.c
+++ b/src/soc/intel/common/block/acpi/acpi.c
@@ -86,13 +86,34 @@
 	return current;
 }
 
+__weak const struct madt_ioapic_info *soc_get_ioapic_info(size_t *entries)
+{
+	*entries = 0;
+	return NULL;
+}
+
 unsigned long acpi_fill_madt(unsigned long current)
 {
+	const struct madt_ioapic_info *ioapic_table;
+	size_t ioapic_entries;
+
 	/* Local APICs */
 	current = acpi_create_madt_lapics(current);
 
 	/* IOAPIC */
-	current += acpi_create_madt_ioapic((void *)current, 2, IO_APIC_ADDR, 0);
+	ioapic_table = soc_get_ioapic_info(&ioapic_entries);
+	if (ioapic_entries) {
+		for (int i = 0; i < ioapic_entries; i++) {
+			current += acpi_create_madt_ioapic(
+					(void *)current,
+					ioapic_table[i].id,
+					ioapic_table[i].addr,
+					ioapic_table[i].gsi_base);
+		}
+	} else {
+		/* Default SOC IOAPIC entry */
+		current += acpi_create_madt_ioapic((void *)current, 2, IO_APIC_ADDR, 0);
+	}
 
 	return acpi_madt_irq_overrides(current);
 }