Felix Held has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/79861?usp=email )
Change subject: soc/amd/common/acpi: factor out common MADT code ......................................................................
soc/amd/common/acpi: factor out common MADT code
The acpi_fill_madt implementation from the Genoa PoC also works for the other AMD SoCs that select SOC_AMD_COMMON_BLOCK_DATA_FABRIC_DOMAIN, so factor out this function to the common AMD ACPI code and change those other SoCs to use the new common functionality instead of having their own implementations.
The old code on the single-domain SoCs used the GNB_IO_APIC_ADDR base address to create the MADT entry for the additional IOAPIC in the root complex. The new code iterates over all domains and looks for a resource with the IOMMU_IOAPIC_IDX index in each domain and if it finds it, it creates an MADT entry for that IOAPIC. This resource is created earlier in the boot process when the non-PCI resources are read from the IOHC registers and reported to the allocator.
TEST=The resulting MADT doesn't change on Mandolin
Signed-off-by: Felix Held felix-coreboot@felixheld.de Change-Id: I4cc0d3f30b4e6ba29542dcfde84ccac90820d258 --- M src/soc/amd/cezanne/Kconfig M src/soc/amd/cezanne/acpi.c M src/soc/amd/common/block/acpi/Kconfig M src/soc/amd/common/block/acpi/Makefile.inc A src/soc/amd/common/block/acpi/madt.c M src/soc/amd/genoa_poc/Kconfig M src/soc/amd/genoa_poc/acpi.c M src/soc/amd/glinda/Kconfig M src/soc/amd/glinda/acpi.c M src/soc/amd/mendocino/Kconfig M src/soc/amd/mendocino/acpi.c M src/soc/amd/phoenix/Kconfig M src/soc/amd/phoenix/acpi.c M src/soc/amd/picasso/Kconfig M src/soc/amd/picasso/acpi.c 15 files changed, 32 insertions(+), 58 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/61/79861/1
diff --git a/src/soc/amd/cezanne/Kconfig b/src/soc/amd/cezanne/Kconfig index 9c15dd9..42a7bf3 100644 --- a/src/soc/amd/cezanne/Kconfig +++ b/src/soc/amd/cezanne/Kconfig @@ -35,6 +35,7 @@ select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE select SOC_AMD_COMMON_BLOCK_ACPI_GPIO select SOC_AMD_COMMON_BLOCK_ACPI_IVRS + select SOC_AMD_COMMON_BLOCK_ACPI_MADT select SOC_AMD_COMMON_BLOCK_AOAC select SOC_AMD_COMMON_BLOCK_APOB select SOC_AMD_COMMON_BLOCK_APOB_HASH diff --git a/src/soc/amd/cezanne/acpi.c b/src/soc/amd/cezanne/acpi.c index 4d2482d..ea895c9 100644 --- a/src/soc/amd/cezanne/acpi.c +++ b/src/soc/amd/cezanne/acpi.c @@ -18,15 +18,6 @@ #include <types.h> #include "chip.h"
-unsigned long acpi_fill_madt(unsigned long current) -{ - - current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, - GNB_IO_APIC_ADDR); - - return current; -} - /* * Reference section 5.2.9 Fixed ACPI Description Table (FADT) * in the ACPI 3.0b specification. diff --git a/src/soc/amd/common/block/acpi/Kconfig b/src/soc/amd/common/block/acpi/Kconfig index 9355f7d..1553edc 100644 --- a/src/soc/amd/common/block/acpi/Kconfig +++ b/src/soc/amd/common/block/acpi/Kconfig @@ -30,6 +30,11 @@ config SOC_AMD_COMMON_BLOCK_ACPI_IVRS bool
+config SOC_AMD_COMMON_BLOCK_ACPI_MADT + bool + help + TODO + config ACPI_SSDT_PSD_INDEPENDENT bool "Allow core p-state independent transitions" default y diff --git a/src/soc/amd/common/block/acpi/Makefile.inc b/src/soc/amd/common/block/acpi/Makefile.inc index a0d9290..763a3bc 100644 --- a/src/soc/amd/common/block/acpi/Makefile.inc +++ b/src/soc/amd/common/block/acpi/Makefile.inc @@ -12,6 +12,7 @@ ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE) += cpu_power_state.c ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_ACPI_GPIO) += gpio.c ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_ACPI_IVRS) += ivrs.c +ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_ACPI_MADT) += madt.c
romstage-y += elog.c ramstage-y += elog.c diff --git a/src/soc/amd/common/block/acpi/madt.c b/src/soc/amd/common/block/acpi/madt.c new file mode 100644 index 0000000..14fab74b --- /dev/null +++ b/src/soc/amd/common/block/acpi/madt.c @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <acpi/acpi.h> +#include <amdblocks/data_fabric.h> +#include <device/device.h> + +unsigned long acpi_fill_madt(unsigned long current) +{ + struct device *dev = NULL; + while ((dev = dev_find_path(dev, DEVICE_PATH_DOMAIN)) != NULL) { + struct resource *res = probe_resource(dev, IOMMU_IOAPIC_IDX); + if (!res) + continue; + + current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, + res->base); + } + + return current; +} diff --git a/src/soc/amd/genoa_poc/Kconfig b/src/soc/amd/genoa_poc/Kconfig index 19ffe6c..09e04f3 100644 --- a/src/soc/amd/genoa_poc/Kconfig +++ b/src/soc/amd/genoa_poc/Kconfig @@ -17,6 +17,7 @@ select SOC_AMD_COMMON_BLOCK_ACPIMMIO select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE select SOC_AMD_COMMON_BLOCK_ACPI_IVRS + select SOC_AMD_COMMON_BLOCK_ACPI_MADT select SOC_AMD_COMMON_BLOCK_AOAC select SOC_AMD_COMMON_BLOCK_BANKED_GPIOS select SOC_AMD_COMMON_BLOCK_CPUFREQ_FAM17H_19H diff --git a/src/soc/amd/genoa_poc/acpi.c b/src/soc/amd/genoa_poc/acpi.c index d9b934f..7762e9d 100644 --- a/src/soc/amd/genoa_poc/acpi.c +++ b/src/soc/amd/genoa_poc/acpi.c @@ -6,29 +6,12 @@ #include <amdblocks/acpi.h> #include <amdblocks/acpimmio.h> #include <amdblocks/cpu.h> -#include <amdblocks/data_fabric.h> #include <arch/ioapic.h> #include <console/console.h> #include <device/device.h> #include <soc/acpi.h> #include <vendorcode/amd/opensil/genoa_poc/opensil.h>
-/* TODO: this can go in a common place */ -unsigned long acpi_fill_madt(unsigned long current) -{ - struct device *dev = NULL; - while ((dev = dev_find_path(dev, DEVICE_PATH_DOMAIN)) != NULL) { - struct resource *res = probe_resource(dev, IOMMU_IOAPIC_IDX); - if (!res) - continue; - - current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, - res->base); - } - - return current; -} - void acpi_fill_fadt(acpi_fadt_t *fadt) { /* Fill in pm1_evt, pm1_cnt, pm_tmr, gpe0_blk from openSIL input structure */ diff --git a/src/soc/amd/glinda/Kconfig b/src/soc/amd/glinda/Kconfig index a3b0ea6..9d71da4 100644 --- a/src/soc/amd/glinda/Kconfig +++ b/src/soc/amd/glinda/Kconfig @@ -36,6 +36,7 @@ select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE select SOC_AMD_COMMON_BLOCK_ACPI_GPIO # TODO: Check if this is still correct select SOC_AMD_COMMON_BLOCK_ACPI_IVRS # TODO: Check if this is still correct + select SOC_AMD_COMMON_BLOCK_ACPI_MADT select SOC_AMD_COMMON_BLOCK_AOAC # TODO: Check if this is still correct select SOC_AMD_COMMON_BLOCK_APOB # TODO: Check if this is still correct select SOC_AMD_COMMON_BLOCK_APOB_HASH # TODO: Check if this is still correct diff --git a/src/soc/amd/glinda/acpi.c b/src/soc/amd/glinda/acpi.c index 88cf688..a927f8b 100644 --- a/src/soc/amd/glinda/acpi.c +++ b/src/soc/amd/glinda/acpi.c @@ -21,14 +21,6 @@ #include <types.h> #include "chip.h"
-unsigned long acpi_fill_madt(unsigned long current) -{ - current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, - GNB_IO_APIC_ADDR); - - return current; -} - /* * Reference section 5.2.9 Fixed ACPI Description Table (FADT) * in the ACPI 3.0b specification. diff --git a/src/soc/amd/mendocino/Kconfig b/src/soc/amd/mendocino/Kconfig index d5aae52..7192106 100644 --- a/src/soc/amd/mendocino/Kconfig +++ b/src/soc/amd/mendocino/Kconfig @@ -38,6 +38,7 @@ select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE select SOC_AMD_COMMON_BLOCK_ACPI_GPIO select SOC_AMD_COMMON_BLOCK_ACPI_IVRS + select SOC_AMD_COMMON_BLOCK_ACPI_MADT select SOC_AMD_COMMON_BLOCK_AOAC select SOC_AMD_COMMON_BLOCK_APOB select SOC_AMD_COMMON_BLOCK_APOB_HASH diff --git a/src/soc/amd/mendocino/acpi.c b/src/soc/amd/mendocino/acpi.c index 07f4d3e..80d407c 100644 --- a/src/soc/amd/mendocino/acpi.c +++ b/src/soc/amd/mendocino/acpi.c @@ -20,14 +20,6 @@ #include <types.h> #include "chip.h"
-unsigned long acpi_fill_madt(unsigned long current) -{ - current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, - GNB_IO_APIC_ADDR); - - return current; -} - /* * Reference section 5.2.9 Fixed ACPI Description Table (FADT) * in the ACPI 3.0b specification. diff --git a/src/soc/amd/phoenix/Kconfig b/src/soc/amd/phoenix/Kconfig index d35ecc2..cd28725 100644 --- a/src/soc/amd/phoenix/Kconfig +++ b/src/soc/amd/phoenix/Kconfig @@ -38,6 +38,7 @@ select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE select SOC_AMD_COMMON_BLOCK_ACPI_GPIO # TODO: Check if this is still correct select SOC_AMD_COMMON_BLOCK_ACPI_IVRS # TODO: Check if this is still correct + select SOC_AMD_COMMON_BLOCK_ACPI_MADT select SOC_AMD_COMMON_BLOCK_AOAC select SOC_AMD_COMMON_BLOCK_APOB select SOC_AMD_COMMON_BLOCK_APOB_HASH diff --git a/src/soc/amd/phoenix/acpi.c b/src/soc/amd/phoenix/acpi.c index 9ed1159b..ce727a8 100644 --- a/src/soc/amd/phoenix/acpi.c +++ b/src/soc/amd/phoenix/acpi.c @@ -21,14 +21,6 @@ #include <types.h> #include "chip.h"
-unsigned long acpi_fill_madt(unsigned long current) -{ - current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, - GNB_IO_APIC_ADDR); - - return current; -} - /* * Reference section 5.2.9 Fixed ACPI Description Table (FADT) * in the ACPI 3.0b specification. diff --git a/src/soc/amd/picasso/Kconfig b/src/soc/amd/picasso/Kconfig index ee5e130..f501398 100644 --- a/src/soc/amd/picasso/Kconfig +++ b/src/soc/amd/picasso/Kconfig @@ -30,6 +30,7 @@ select SOC_AMD_COMMON_BLOCK_ACPI_CPU_POWER_STATE select SOC_AMD_COMMON_BLOCK_ACPI_GPIO select SOC_AMD_COMMON_BLOCK_ACPI_IVRS + select SOC_AMD_COMMON_BLOCK_ACPI_MADT select SOC_AMD_COMMON_BLOCK_AOAC select SOC_AMD_COMMON_BLOCK_APOB select SOC_AMD_COMMON_BLOCK_BANKED_GPIOS diff --git a/src/soc/amd/picasso/acpi.c b/src/soc/amd/picasso/acpi.c index c6aa83f..92f48df 100644 --- a/src/soc/amd/picasso/acpi.c +++ b/src/soc/amd/picasso/acpi.c @@ -24,14 +24,6 @@ #include <soc/southbridge.h> #include "chip.h"
-unsigned long acpi_fill_madt(unsigned long current) -{ - current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, - GNB_IO_APIC_ADDR); - - return current; -} - /* * Reference section 5.2.9 Fixed ACPI Description Table (FADT) * in the ACPI 3.0b specification.