diff options
author | Felix Held <felix-coreboot@felixheld.de> | 2023-06-02 15:30:50 +0200 |
---|---|---|
committer | Arthur Heymans <arthur@aheymans.xyz> | 2023-06-15 08:20:50 +0000 |
commit | 12a448224f512deba57221c0757f148e626240e0 (patch) | |
tree | 2b8fb113df223469245487f0e024ebc34289d152 /src/soc | |
parent | d0627c7595feb580c8c03f0335644b85bbc842aa (diff) |
soc/amd/*/root_complex: reserve IOMMU MMIO area
This makes sure that the resource allocator won't use this address range
for anything else. In the systems I looked at, this was between the end
of the above 4GB memory and the beginning of the above 4GB PCI BAR MMIO
region, but better reserve it here so nothing else will get allocated
there if this expectation isn't met.
TEST=Reserved region is printed in the console logs:
update_constraints: PCI: 00:00.0 09 base fd00000000 limit fdffffffff mem (fixed)
Signed-off-by: Felix Held <felix-coreboot@felixheld.de>
Change-Id: I5a8150873cb019ca1d903ed269e18d6f9fabb871
Reviewed-on: https://review.coreboot.org/c/coreboot/+/75611
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Eric Lai <eric_lai@quanta.corp-partner.google.com>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Diffstat (limited to 'src/soc')
-rw-r--r-- | src/soc/amd/cezanne/root_complex.c | 4 | ||||
-rw-r--r-- | src/soc/amd/common/block/include/amdblocks/iomap.h | 3 | ||||
-rw-r--r-- | src/soc/amd/glinda/root_complex.c | 4 | ||||
-rw-r--r-- | src/soc/amd/mendocino/root_complex.c | 4 | ||||
-rw-r--r-- | src/soc/amd/phoenix/root_complex.c | 4 | ||||
-rw-r--r-- | src/soc/amd/picasso/root_complex.c | 4 |
6 files changed, 23 insertions, 0 deletions
diff --git a/src/soc/amd/cezanne/root_complex.c b/src/soc/amd/cezanne/root_complex.c index 29070f6d4e..b5bf62c061 100644 --- a/src/soc/amd/cezanne/root_complex.c +++ b/src/soc/amd/cezanne/root_complex.c @@ -5,6 +5,7 @@ #include <amdblocks/alib.h> #include <amdblocks/data_fabric.h> #include <amdblocks/ioapic.h> +#include <amdblocks/iomap.h> #include <amdblocks/memmap.h> #include <arch/ioapic.h> #include <arch/vga.h> @@ -151,6 +152,9 @@ static void read_resources(struct device *dev) gnb_apic->size = 0x00001000; gnb_apic->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED | IORESOURCE_FIXED; + /* 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__); diff --git a/src/soc/amd/common/block/include/amdblocks/iomap.h b/src/soc/amd/common/block/include/amdblocks/iomap.h index 759466b052..d166a833a9 100644 --- a/src/soc/amd/common/block/include/amdblocks/iomap.h +++ b/src/soc/amd/common/block/include/amdblocks/iomap.h @@ -12,4 +12,7 @@ #define FLASH_BELOW_4GB_MAPPING_REGION_BASE ((0xffffffff - 16 * MiB) + 1) #define FLASH_BELOW_4GB_MAPPING_REGION_SIZE (16 * MiB) +#define IOMMU_RESERVED_MMIO_BASE 0xfd00000000 +#define IOMMU_RESERVED_MMIO_SIZE (4ULL * GiB) + #endif /* AMD_BLOCK_IOMAP_H */ diff --git a/src/soc/amd/glinda/root_complex.c b/src/soc/amd/glinda/root_complex.c index b18e948abe..1794d08983 100644 --- a/src/soc/amd/glinda/root_complex.c +++ b/src/soc/amd/glinda/root_complex.c @@ -7,6 +7,7 @@ #include <amdblocks/alib.h> #include <amdblocks/data_fabric.h> #include <amdblocks/ioapic.h> +#include <amdblocks/iomap.h> #include <amdblocks/memmap.h> #include <arch/ioapic.h> #include <arch/vga.h> @@ -166,6 +167,9 @@ static void read_resources(struct device *dev) gnb_apic->size = 0x00001000; gnb_apic->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED | IORESOURCE_FIXED; + /* 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__); diff --git a/src/soc/amd/mendocino/root_complex.c b/src/soc/amd/mendocino/root_complex.c index 7a58f015e6..0dcf2b8a02 100644 --- a/src/soc/amd/mendocino/root_complex.c +++ b/src/soc/amd/mendocino/root_complex.c @@ -7,6 +7,7 @@ #include <amdblocks/alib.h> #include <amdblocks/data_fabric.h> #include <amdblocks/ioapic.h> +#include <amdblocks/iomap.h> #include <amdblocks/memmap.h> #include <arch/ioapic.h> #include <arch/vga.h> @@ -194,6 +195,9 @@ static void read_resources(struct device *dev) gnb_apic->size = 0x00001000; gnb_apic->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED | IORESOURCE_FIXED; + /* 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__); diff --git a/src/soc/amd/phoenix/root_complex.c b/src/soc/amd/phoenix/root_complex.c index 3110ea3ee5..a75de50618 100644 --- a/src/soc/amd/phoenix/root_complex.c +++ b/src/soc/amd/phoenix/root_complex.c @@ -7,6 +7,7 @@ #include <amdblocks/alib.h> #include <amdblocks/data_fabric.h> #include <amdblocks/ioapic.h> +#include <amdblocks/iomap.h> #include <amdblocks/memmap.h> #include <arch/ioapic.h> #include <arch/vga.h> @@ -166,6 +167,9 @@ static void read_resources(struct device *dev) gnb_apic->size = 0x00001000; gnb_apic->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED | IORESOURCE_FIXED; + /* 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__); diff --git a/src/soc/amd/picasso/root_complex.c b/src/soc/amd/picasso/root_complex.c index cd10fdb762..bf36f6dd50 100644 --- a/src/soc/amd/picasso/root_complex.c +++ b/src/soc/amd/picasso/root_complex.c @@ -6,6 +6,7 @@ #include <amdblocks/data_fabric.h> #include <amdblocks/memmap.h> #include <amdblocks/ioapic.h> +#include <amdblocks/iomap.h> #include <arch/ioapic.h> #include <arch/vga.h> #include <assert.h> @@ -149,6 +150,9 @@ static void read_resources(struct device *dev) gnb_apic->size = 0x00001000; gnb_apic->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED | IORESOURCE_FIXED; + /* 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; |