diff --git a/src/soc/amd/cezanne/root_complex.c b/src/soc/amd/cezanne/root_complex.c index 2e3c5c7c7f..ecb1991cae 100644 --- a/src/soc/amd/cezanne/root_complex.c +++ b/src/soc/amd/cezanne/root_complex.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include "chip.h" @@ -106,8 +105,6 @@ static void read_resources(struct device *dev) { uint32_t mem_usable = (uintptr_t)cbmem_top(); unsigned int idx = 0; - const struct hob_header *hob_iterator; - const struct hob_resource *res; uintptr_t early_reserved_dram_start, early_reserved_dram_end; const struct memmap_early_dram *e = memmap_get_early_dram_usage(); @@ -146,26 +143,7 @@ static void read_resources(struct device *dev) /* Reserve fixed IOMMU MMIO region */ mmio_range(dev, idx++, IOMMU_RESERVED_MMIO_BASE, IOMMU_RESERVED_MMIO_SIZE); - if (fsp_hob_iterator_init(&hob_iterator) != CB_SUCCESS) { - printk(BIOS_ERR, "%s incomplete because no HOB list was found\n", - __func__); - return; - } - - while (fsp_hob_iterator_get_next_resource(&hob_iterator, &res) == CB_SUCCESS) { - if (res->type == EFI_RESOURCE_SYSTEM_MEMORY && res->addr < mem_usable) - continue; /* 0 through low usable was set above */ - if (res->type == EFI_RESOURCE_MEMORY_MAPPED_IO) - continue; /* Done separately */ - - if (res->type == EFI_RESOURCE_SYSTEM_MEMORY) - ram_range(dev, idx++, res->addr, res->length); - else if (res->type == EFI_RESOURCE_MEMORY_RESERVED) - reserved_ram_range(dev, idx++, res->addr, res->length); - else - printk(BIOS_ERR, "failed to set resources for type %d\n", - res->type); - } + read_fsp_resources(dev, &idx); } static void root_complex_init(struct device *dev) diff --git a/src/soc/amd/common/block/include/amdblocks/root_complex.h b/src/soc/amd/common/block/include/amdblocks/root_complex.h index 6149897b1e..fd75ddffa3 100644 --- a/src/soc/amd/common/block/include/amdblocks/root_complex.h +++ b/src/soc/amd/common/block/include/amdblocks/root_complex.h @@ -22,4 +22,6 @@ void read_non_pci_resources(struct device *domain, unsigned int *idx); uint32_t get_iohc_misc_smn_base(struct device *domain); const struct non_pci_mmio_reg *get_iohc_non_pci_mmio_regs(size_t *count); +void read_fsp_resources(struct device *dev, unsigned int *idx); + #endif /* AMD_BLOCK_ROOT_COMPLEX_H */ diff --git a/src/soc/amd/common/fsp/Makefile.inc b/src/soc/amd/common/fsp/Makefile.inc index ab9a7ab507..cb4b675975 100644 --- a/src/soc/amd/common/fsp/Makefile.inc +++ b/src/soc/amd/common/fsp/Makefile.inc @@ -2,6 +2,7 @@ ifeq ($(CONFIG_PLATFORM_USES_FSP2_0),y) romstage-y += fsp_reset.c romstage-y += fsp_validate.c +ramstage-y += fsp_report_resources.c ramstage-y += fsp_reset.c ramstage-$(CONFIG_HAVE_ACPI_TABLES) += fsp-acpi.c ramstage-$(CONFIG_SOC_AMD_COMMON_FSP_CCX_CPPC_HOB) += fsp_ccx_cppc_hob.c diff --git a/src/soc/amd/common/fsp/fsp_report_resources.c b/src/soc/amd/common/fsp/fsp_report_resources.c new file mode 100644 index 0000000000..bcc0715982 --- /dev/null +++ b/src/soc/amd/common/fsp/fsp_report_resources.c @@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include +#include +#include + +void read_fsp_resources(struct device *dev, unsigned int *idx) +{ + const uint32_t mem_usable = (uintptr_t)cbmem_top(); + const struct hob_header *hob_iterator; + const struct hob_resource *res; + + if (fsp_hob_iterator_init(&hob_iterator) != CB_SUCCESS) { + printk(BIOS_ERR, "%s incomplete because no HOB list was found\n", __func__); + return; + } + + while (fsp_hob_iterator_get_next_resource(&hob_iterator, &res) == CB_SUCCESS) { + if (res->type == EFI_RESOURCE_SYSTEM_MEMORY && res->addr < mem_usable) + /* 0 through low usable is already reported by the root complex code */ + continue; + if (res->type == EFI_RESOURCE_MEMORY_MAPPED_IO) + continue; /* Done separately */ + + if (res->type == EFI_RESOURCE_SYSTEM_MEMORY) + ram_range(dev, (*idx)++, res->addr, res->length); + else if (res->type == EFI_RESOURCE_MEMORY_RESERVED) + reserved_ram_range(dev, (*idx)++, res->addr, res->length); + else + printk(BIOS_ERR, "failed to set resources for type %d\n", res->type); + } +} diff --git a/src/soc/amd/glinda/root_complex.c b/src/soc/amd/glinda/root_complex.c index cf9d7e481f..4474a3fb29 100644 --- a/src/soc/amd/glinda/root_complex.c +++ b/src/soc/amd/glinda/root_complex.c @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include "chip.h" @@ -121,8 +120,6 @@ static void read_resources(struct device *dev) { uint32_t mem_usable = (uintptr_t)cbmem_top(); unsigned int idx = 0; - const struct hob_header *hob_iterator; - const struct hob_resource *res; uintptr_t early_reserved_dram_start, early_reserved_dram_end; const struct memmap_early_dram *e = memmap_get_early_dram_usage(); @@ -161,26 +158,7 @@ static void read_resources(struct device *dev) /* Reserve fixed IOMMU MMIO region */ mmio_range(dev, idx++, IOMMU_RESERVED_MMIO_BASE, IOMMU_RESERVED_MMIO_SIZE); - if (fsp_hob_iterator_init(&hob_iterator) != CB_SUCCESS) { - printk(BIOS_ERR, "%s incomplete because no HOB list was found\n", - __func__); - return; - } - - while (fsp_hob_iterator_get_next_resource(&hob_iterator, &res) == CB_SUCCESS) { - if (res->type == EFI_RESOURCE_SYSTEM_MEMORY && res->addr < mem_usable) - continue; /* 0 through low usable was set above */ - if (res->type == EFI_RESOURCE_MEMORY_MAPPED_IO) - continue; /* Done separately */ - - if (res->type == EFI_RESOURCE_SYSTEM_MEMORY) - ram_range(dev, idx++, res->addr, res->length); - else if (res->type == EFI_RESOURCE_MEMORY_RESERVED) - reserved_ram_range(dev, idx++, res->addr, res->length); - else - printk(BIOS_ERR, "Failed to set resources for type %d\n", - res->type); - } + read_fsp_resources(dev, &idx); } static void root_complex_init(struct device *dev) diff --git a/src/soc/amd/mendocino/root_complex.c b/src/soc/amd/mendocino/root_complex.c index 834052f177..0c95f7a86f 100644 --- a/src/soc/amd/mendocino/root_complex.c +++ b/src/soc/amd/mendocino/root_complex.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include "chip.h" @@ -149,8 +148,6 @@ static void read_resources(struct device *dev) { uint32_t mem_usable = (uintptr_t)cbmem_top(); unsigned int idx = 0; - const struct hob_header *hob_iterator; - const struct hob_resource *res; uintptr_t early_reserved_dram_start, early_reserved_dram_end; const struct memmap_early_dram *e = memmap_get_early_dram_usage(); @@ -189,26 +186,7 @@ static void read_resources(struct device *dev) /* Reserve fixed IOMMU MMIO region */ mmio_range(dev, idx++, IOMMU_RESERVED_MMIO_BASE, IOMMU_RESERVED_MMIO_SIZE); - if (fsp_hob_iterator_init(&hob_iterator) != CB_SUCCESS) { - printk(BIOS_ERR, "%s incomplete because no HOB list was found\n", - __func__); - return; - } - - while (fsp_hob_iterator_get_next_resource(&hob_iterator, &res) == CB_SUCCESS) { - if (res->type == EFI_RESOURCE_SYSTEM_MEMORY && res->addr < mem_usable) - continue; /* 0 through low usable was set above */ - if (res->type == EFI_RESOURCE_MEMORY_MAPPED_IO) - continue; /* Done separately */ - - if (res->type == EFI_RESOURCE_SYSTEM_MEMORY) - ram_range(dev, idx++, res->addr, res->length); - else if (res->type == EFI_RESOURCE_MEMORY_RESERVED) - reserved_ram_range(dev, idx++, res->addr, res->length); - else - printk(BIOS_ERR, "Failed to set resources for type %d\n", - res->type); - } + read_fsp_resources(dev, &idx); } static void root_complex_init(struct device *dev) diff --git a/src/soc/amd/phoenix/root_complex.c b/src/soc/amd/phoenix/root_complex.c index a1f256f73d..b1a3129bfa 100644 --- a/src/soc/amd/phoenix/root_complex.c +++ b/src/soc/amd/phoenix/root_complex.c @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include "chip.h" @@ -121,8 +120,6 @@ static void read_resources(struct device *dev) { uint32_t mem_usable = (uintptr_t)cbmem_top(); unsigned int idx = 0; - const struct hob_header *hob_iterator; - const struct hob_resource *res; uintptr_t early_reserved_dram_start, early_reserved_dram_end; const struct memmap_early_dram *e = memmap_get_early_dram_usage(); @@ -161,26 +158,7 @@ static void read_resources(struct device *dev) /* Reserve fixed IOMMU MMIO region */ mmio_range(dev, idx++, IOMMU_RESERVED_MMIO_BASE, IOMMU_RESERVED_MMIO_SIZE); - if (fsp_hob_iterator_init(&hob_iterator) != CB_SUCCESS) { - printk(BIOS_ERR, "%s incomplete because no HOB list was found\n", - __func__); - return; - } - - while (fsp_hob_iterator_get_next_resource(&hob_iterator, &res) == CB_SUCCESS) { - if (res->type == EFI_RESOURCE_SYSTEM_MEMORY && res->addr < mem_usable) - continue; /* 0 through low usable was set above */ - if (res->type == EFI_RESOURCE_MEMORY_MAPPED_IO) - continue; /* Done separately */ - - if (res->type == EFI_RESOURCE_SYSTEM_MEMORY) - ram_range(dev, idx++, res->addr, res->length); - else if (res->type == EFI_RESOURCE_MEMORY_RESERVED) - reserved_ram_range(dev, idx++, res->addr, res->length); - else - printk(BIOS_ERR, "Failed to set resources for type %d\n", - res->type); - } + read_fsp_resources(dev, &idx); } static void root_complex_init(struct device *dev) diff --git a/src/soc/amd/picasso/root_complex.c b/src/soc/amd/picasso/root_complex.c index 7ae1df0481..b74a132c8b 100644 --- a/src/soc/amd/picasso/root_complex.c +++ b/src/soc/amd/picasso/root_complex.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include "chip.h" @@ -106,8 +105,6 @@ static void read_resources(struct device *dev) { uint32_t mem_usable = (uintptr_t)cbmem_top(); unsigned int idx = 0; - const struct hob_header *hob_iterator; - const struct hob_resource *res; uintptr_t early_reserved_dram_start, early_reserved_dram_end; const struct memmap_early_dram *e = memmap_get_early_dram_usage(); @@ -144,25 +141,7 @@ static void read_resources(struct device *dev) /* Reserve fixed IOMMU MMIO region */ mmio_range(dev, idx++, IOMMU_RESERVED_MMIO_BASE, IOMMU_RESERVED_MMIO_SIZE); - if (fsp_hob_iterator_init(&hob_iterator) != CB_SUCCESS) { - printk(BIOS_ERR, "%s incomplete because no HOB list was found\n", __func__); - return; - } - - while (fsp_hob_iterator_get_next_resource(&hob_iterator, &res) == CB_SUCCESS) { - if (res->type == EFI_RESOURCE_SYSTEM_MEMORY && res->addr < mem_usable) - continue; /* 0 through low usable was set above */ - if (res->type == EFI_RESOURCE_MEMORY_MAPPED_IO) - continue; /* Done separately */ - - if (res->type == EFI_RESOURCE_SYSTEM_MEMORY) - ram_range(dev, idx++, res->addr, res->length); - else if (res->type == EFI_RESOURCE_MEMORY_RESERVED) - reserved_ram_range(dev, idx++, res->addr, res->length); - else - printk(BIOS_ERR, "failed to set resources for type %d\n", - res->type); - } + read_fsp_resources(dev, &idx); } static void root_complex_init(struct device *dev)