summaryrefslogtreecommitdiffstats
path: root/src/soc/amd
diff options
context:
space:
mode:
authorFelix Held <felix-coreboot@felixheld.de>2024-01-08 23:30:38 +0100
committerFelix Held <felix-coreboot@felixheld.de>2024-01-11 01:54:49 +0000
commitaab8a22d9d96c21cd8e482e0960f019682c95931 (patch)
tree32a19112ccb211642774bdd5190aca7cda30893d /src/soc/amd
parenta2b2ac0ed2b39ed3ea7972732521e0d731e50671 (diff)
downloadcoreboot-aab8a22d9d96c21cd8e482e0960f019682c95931.tar.gz
coreboot-aab8a22d9d96c21cd8e482e0960f019682c95931.tar.bz2
coreboot-aab8a22d9d96c21cd8e482e0960f019682c95931.zip
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 Reviewed-on: https://review.coreboot.org/c/coreboot/+/79861 Reviewed-by: Arthur Heymans <arthur@aheymans.xyz> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc/amd')
-rw-r--r--src/soc/amd/cezanne/Kconfig1
-rw-r--r--src/soc/amd/cezanne/acpi.c9
-rw-r--r--src/soc/amd/common/block/acpi/Kconfig6
-rw-r--r--src/soc/amd/common/block/acpi/Makefile.inc1
-rw-r--r--src/soc/amd/common/block/acpi/madt.c20
-rw-r--r--src/soc/amd/genoa_poc/Kconfig1
-rw-r--r--src/soc/amd/genoa_poc/acpi.c17
-rw-r--r--src/soc/amd/glinda/Kconfig1
-rw-r--r--src/soc/amd/glinda/acpi.c8
-rw-r--r--src/soc/amd/mendocino/Kconfig1
-rw-r--r--src/soc/amd/mendocino/acpi.c8
-rw-r--r--src/soc/amd/phoenix/Kconfig1
-rw-r--r--src/soc/amd/phoenix/acpi.c8
-rw-r--r--src/soc/amd/picasso/Kconfig1
-rw-r--r--src/soc/amd/picasso/acpi.c8
15 files changed, 33 insertions, 58 deletions
diff --git a/src/soc/amd/cezanne/Kconfig b/src/soc/amd/cezanne/Kconfig
index 9c15dd98945d..42a7bf335e30 100644
--- a/src/soc/amd/cezanne/Kconfig
+++ b/src/soc/amd/cezanne/Kconfig
@@ -35,6 +35,7 @@ config SOC_AMD_CEZANNE
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 4d2482de5af4..ea895c905f68 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 9355f7d455ad..0f0a37111191 100644
--- a/src/soc/amd/common/block/acpi/Kconfig
+++ b/src/soc/amd/common/block/acpi/Kconfig
@@ -30,6 +30,12 @@ config SOC_AMD_COMMON_BLOCK_ACPI_GPIO
config SOC_AMD_COMMON_BLOCK_ACPI_IVRS
bool
+config SOC_AMD_COMMON_BLOCK_ACPI_MADT
+ bool
+ help
+ Select this to add the common AMD acpi_fill_madt implementation to
+ the build which adds the MADT entries for all non-FCH IOAPICs.
+
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 a0d92907a470..763a3bc61a43 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_CPPC) += cppc.c
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 000000000000..14fab74b8492
--- /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 19ffe6c40b92..09e04f3e57f3 100644
--- a/src/soc/amd/genoa_poc/Kconfig
+++ b/src/soc/amd/genoa_poc/Kconfig
@@ -17,6 +17,7 @@ config SOC_SPECIFIC_OPTIONS
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 d9b934f42a2c..7762e9d4c7a4 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 50cd88de1ab8..ac0c96b157a6 100644
--- a/src/soc/amd/glinda/Kconfig
+++ b/src/soc/amd/glinda/Kconfig
@@ -36,6 +36,7 @@ config SOC_AMD_GLINDA
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 88cf688172d5..a927f8b68d17 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 d5aae5203b36..7192106922ac 100644
--- a/src/soc/amd/mendocino/Kconfig
+++ b/src/soc/amd/mendocino/Kconfig
@@ -38,6 +38,7 @@ config SOC_AMD_REMBRANDT_BASE
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 07f4d3e90506..80d407cce2d9 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 d35ecc2a0077..cd287254cfc9 100644
--- a/src/soc/amd/phoenix/Kconfig
+++ b/src/soc/amd/phoenix/Kconfig
@@ -38,6 +38,7 @@ config SOC_AMD_PHOENIX
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 9ed1159b5015..ce727a8904a8 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 ee5e13059b13..f501398729b9 100644
--- a/src/soc/amd/picasso/Kconfig
+++ b/src/soc/amd/picasso/Kconfig
@@ -30,6 +30,7 @@ config SOC_AMD_PICASSO
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 c6aa83f0d076..92f48df32e38 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.