From a4a2a4f033dc48a0a24d54f34364dd2ded627699 Mon Sep 17 00:00:00 2001 From: Felix Held Date: Thu, 25 Jan 2024 18:53:54 +0100 Subject: [PATCH] soc/amd: factor out common acpi_add_ivrs_table implementation Instead of open-coding this functionality in all AMD SoCs, factor it out into a common implementation. Signed-off-by: Felix Held Change-Id: Idb65c398b747e70ec67107e0a1d4bd6551501347 Reviewed-on: https://review.coreboot.org/c/coreboot/+/80208 Reviewed-by: Matt DeVillier Tested-by: build bot (Jenkins) Reviewed-by: Varshit Pandya Reviewed-by: Marshall Dawson --- src/soc/amd/cezanne/agesa_acpi.c | 8 +------- src/soc/amd/common/block/acpi/ivrs.c | 15 ++++++++++++++- src/soc/amd/common/block/include/amdblocks/acpi.h | 2 +- src/soc/amd/genoa_poc/acpi.c | 7 +------ src/soc/amd/glinda/agesa_acpi.c | 8 +------- src/soc/amd/mendocino/agesa_acpi.c | 8 +------- src/soc/amd/phoenix/agesa_acpi.c | 8 +------- src/soc/amd/picasso/agesa_acpi.c | 7 +------ 8 files changed, 21 insertions(+), 42 deletions(-) diff --git a/src/soc/amd/cezanne/agesa_acpi.c b/src/soc/amd/cezanne/agesa_acpi.c index fdfe3eb3d7..e6ccd9cbd5 100644 --- a/src/soc/amd/cezanne/agesa_acpi.c +++ b/src/soc/amd/cezanne/agesa_acpi.c @@ -10,8 +10,6 @@ uintptr_t agesa_write_acpi_tables(const struct device *device, uintptr_t current, acpi_rsdp_t *rsdp) { - acpi_ivrs_t *ivrs; - /* TODO: look into adding CRAT */ /* add ALIB SSDT from HOB */ @@ -19,11 +17,7 @@ uintptr_t agesa_write_acpi_tables(const struct device *device, uintptr_t current current = add_agesa_fsp_acpi_table(AMD_FSP_ACPI_ALIB_HOB_GUID, "ALIB", rsdp, current); /* IVRS */ - current = acpi_align_current(current); - ivrs = (acpi_ivrs_t *)current; - acpi_create_ivrs(ivrs, acpi_fill_ivrs); - current += ivrs->header.length; - acpi_add_table(rsdp, ivrs); + current = acpi_add_ivrs_table(current, rsdp); return current; } diff --git a/src/soc/amd/common/block/acpi/ivrs.c b/src/soc/amd/common/block/acpi/ivrs.c index 605c4f56b3..547163c6ff 100644 --- a/src/soc/amd/common/block/acpi/ivrs.c +++ b/src/soc/amd/common/block/acpi/ivrs.c @@ -297,7 +297,7 @@ static unsigned long acpi_fill_ivrs11(unsigned long current, acpi_ivrs_ivhd_t *i return acpi_fill_ivrs40(current, ivhd, nb_dev, iommu_dev); } -unsigned long acpi_fill_ivrs(acpi_ivrs_t *ivrs, unsigned long current) +static unsigned long acpi_fill_ivrs(acpi_ivrs_t *ivrs, unsigned long current) { unsigned long current_backup; uint64_t mmio_x30_value; @@ -433,3 +433,16 @@ unsigned long acpi_fill_ivrs(acpi_ivrs_t *ivrs, unsigned long current) return current; } + +unsigned long acpi_add_ivrs_table(unsigned long current, acpi_rsdp_t *rsdp) +{ + acpi_ivrs_t *ivrs; + + current = acpi_align_current(current); + ivrs = (acpi_ivrs_t *)current; + acpi_create_ivrs(ivrs, acpi_fill_ivrs); + current += ivrs->header.length; + acpi_add_table(rsdp, ivrs); + + return current; +} diff --git a/src/soc/amd/common/block/include/amdblocks/acpi.h b/src/soc/amd/common/block/include/amdblocks/acpi.h index 9c70864988..a195371cb9 100644 --- a/src/soc/amd/common/block/include/amdblocks/acpi.h +++ b/src/soc/amd/common/block/include/amdblocks/acpi.h @@ -56,6 +56,6 @@ uintptr_t add_agesa_fsp_acpi_table(guid_t guid, const char *name, acpi_rsdp_t *r uintptr_t current); void acpi_log_events(const struct chipset_power_state *ps); -unsigned long acpi_fill_ivrs(acpi_ivrs_t *ivrs, unsigned long current); +unsigned long acpi_add_ivrs_table(unsigned long current, acpi_rsdp_t *rsdp); #endif /* AMD_BLOCK_ACPI_H */ diff --git a/src/soc/amd/genoa_poc/acpi.c b/src/soc/amd/genoa_poc/acpi.c index 7762e9d4c7..cadf8db2f0 100644 --- a/src/soc/amd/genoa_poc/acpi.c +++ b/src/soc/amd/genoa_poc/acpi.c @@ -42,12 +42,7 @@ unsigned long soc_acpi_write_tables(const struct device *device, unsigned long c struct acpi_rsdp *rsdp) { /* IVRS */ - acpi_ivrs_t *ivrs; - current = acpi_align_current(current); - ivrs = (acpi_ivrs_t *)current; - acpi_create_ivrs(ivrs, acpi_fill_ivrs); - current += ivrs->header.length; - acpi_add_table(rsdp, ivrs); + current = acpi_add_ivrs_table(current, rsdp); return current; } diff --git a/src/soc/amd/glinda/agesa_acpi.c b/src/soc/amd/glinda/agesa_acpi.c index 7ac19c72de..f6c3c984f2 100644 --- a/src/soc/amd/glinda/agesa_acpi.c +++ b/src/soc/amd/glinda/agesa_acpi.c @@ -12,8 +12,6 @@ uintptr_t agesa_write_acpi_tables(const struct device *device, uintptr_t current, acpi_rsdp_t *rsdp) { - acpi_ivrs_t *ivrs; - /* TODO: look into adding CRAT */ /* add ALIB SSDT from HOB */ @@ -21,11 +19,7 @@ uintptr_t agesa_write_acpi_tables(const struct device *device, uintptr_t current current = add_agesa_fsp_acpi_table(AMD_FSP_ACPI_ALIB_HOB_GUID, "ALIB", rsdp, current); /* IVRS */ - current = acpi_align_current(current); - ivrs = (acpi_ivrs_t *)current; - acpi_create_ivrs(ivrs, acpi_fill_ivrs); - current += ivrs->header.length; - acpi_add_table(rsdp, ivrs); + current = acpi_add_ivrs_table(current, rsdp); return current; } diff --git a/src/soc/amd/mendocino/agesa_acpi.c b/src/soc/amd/mendocino/agesa_acpi.c index d60a79d51f..1e4d6005e7 100644 --- a/src/soc/amd/mendocino/agesa_acpi.c +++ b/src/soc/amd/mendocino/agesa_acpi.c @@ -12,8 +12,6 @@ uintptr_t agesa_write_acpi_tables(const struct device *device, uintptr_t current, acpi_rsdp_t *rsdp) { - acpi_ivrs_t *ivrs; - /* TODO: look into adding CRAT */ /* add ALIB SSDT from HOB */ @@ -21,11 +19,7 @@ uintptr_t agesa_write_acpi_tables(const struct device *device, uintptr_t current current = add_agesa_fsp_acpi_table(AMD_FSP_ACPI_ALIB_HOB_GUID, "ALIB", rsdp, current); /* IVRS */ - current = acpi_align_current(current); - ivrs = (acpi_ivrs_t *)current; - acpi_create_ivrs(ivrs, acpi_fill_ivrs); - current += ivrs->header.length; - acpi_add_table(rsdp, ivrs); + current = acpi_add_ivrs_table(current, rsdp); return current; } diff --git a/src/soc/amd/phoenix/agesa_acpi.c b/src/soc/amd/phoenix/agesa_acpi.c index 251acc6c31..598ae81154 100644 --- a/src/soc/amd/phoenix/agesa_acpi.c +++ b/src/soc/amd/phoenix/agesa_acpi.c @@ -13,8 +13,6 @@ uintptr_t agesa_write_acpi_tables(const struct device *device, uintptr_t current, acpi_rsdp_t *rsdp) { - acpi_ivrs_t *ivrs; - /* TODO: look into adding CRAT */ /* add ALIB SSDT from HOB */ @@ -22,11 +20,7 @@ uintptr_t agesa_write_acpi_tables(const struct device *device, uintptr_t current current = add_agesa_fsp_acpi_table(AMD_FSP_ACPI_ALIB_HOB_GUID, "ALIB", rsdp, current); /* IVRS */ - current = acpi_align_current(current); - ivrs = (acpi_ivrs_t *)current; - acpi_create_ivrs(ivrs, acpi_fill_ivrs); - current += ivrs->header.length; - acpi_add_table(rsdp, ivrs); + current = acpi_add_ivrs_table(current, rsdp); return current; } diff --git a/src/soc/amd/picasso/agesa_acpi.c b/src/soc/amd/picasso/agesa_acpi.c index 9ee977f2ac..7a32779f60 100644 --- a/src/soc/amd/picasso/agesa_acpi.c +++ b/src/soc/amd/picasso/agesa_acpi.c @@ -542,7 +542,6 @@ static unsigned long acpi_fill_crat(struct acpi_crat_header *crat, unsigned long uintptr_t agesa_write_acpi_tables(const struct device *device, uintptr_t current, acpi_rsdp_t *rsdp) { - acpi_ivrs_t *ivrs; struct acpi_crat_header *crat; /* CRAT */ @@ -557,11 +556,7 @@ uintptr_t agesa_write_acpi_tables(const struct device *device, uintptr_t current current = add_agesa_fsp_acpi_table(AMD_FSP_ACPI_ALIB_HOB_GUID, "ALIB", rsdp, current); /* IVRS */ - current = acpi_align_current(current); - ivrs = (acpi_ivrs_t *)current; - acpi_create_ivrs(ivrs, acpi_fill_ivrs); - current += ivrs->header.length; - acpi_add_table(rsdp, ivrs); + current = acpi_add_ivrs_table(current, rsdp); /* Add SRAT, MSCT, SLIT if needed in the future */