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);
}