Patrick Georgi (patrick@georgi-clan.de) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/2662
-gerrit
commit fc2976167726e066d16c1cd8c920d6df90144848 Author: Nico Huber nico.huber@secunet.com Date: Fri Mar 8 12:36:04 2013 +0100
amdk8: Increase limits for MMIO to TOLM..MMCONF
ACPI tells the OS that TOLM..MMCONF is safe to use for device's MMIO regions. Unfortunately we never told the chipset, but gave it only the region that our own resource assignment used.
With this change, devices that are configured by the OS (for whatever reason: PCIe hotplug, because the OS feels like it, or as in our case, a bug in the coreboot resource allocator that leaves devices unallocated) actually work (assuming that there are no other bugs)
Change-Id: Ib63c05484739d84198a9f10352be2055c6f14385 Signed-off-by: Nico Huber nico.huber@secunet.com Signed-off-by: Patrick Georgi patrick.georgi@secunet.com --- src/northbridge/amd/amdk8/northbridge.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
diff --git a/src/northbridge/amd/amdk8/northbridge.c b/src/northbridge/amd/amdk8/northbridge.c index 5c1d97a..da8cf48 100644 --- a/src/northbridge/amd/amdk8/northbridge.c +++ b/src/northbridge/amd/amdk8/northbridge.c @@ -33,6 +33,8 @@
#include <cpu/amd/amdk8_sysconf.h>
+#include <southbridge/amd/rs690/rs690.h> + struct amdk8_sysconf_t sysconf;
#define MAX_FX_DEVS 8 @@ -531,6 +533,10 @@ static void amdk8_set_resources(device_t dev) struct bus *bus; struct resource *res;
+ struct resource *mem_lowest = NULL, *mem_highest = NULL; + + const uint32_t topmem = (uint32_t)bsp_topmem(); + /* Find the nodeid */ nodeid = amdk8_nodeid(dev);
@@ -559,6 +565,29 @@ static void amdk8_set_resources(device_t dev) res->index = index;
amdk8_set_resource(dev, res, nodeid); + + if (res->flags & IORESOURCE_MEM) { + if (!mem_lowest || (res->base > topmem && + res->base < mem_lowest->base)) + mem_lowest = res; + if (!mem_highest || + (res->base + res->size) > + (mem_highest->base + mem_highest->size)) + mem_highest = res; + } + } + + if (mem_lowest && mem_lowest->base > topmem) { + mem_lowest->size += mem_lowest->base - topmem; + mem_lowest->base = topmem; + mem_lowest->flags &= ~IORESOURCE_STORED; + amdk8_set_resource(dev, mem_lowest, nodeid); + } + if (mem_highest && (mem_highest->base + mem_highest->size) < + EXT_CONF_BASE_ADDRESS) { + mem_highest->size = EXT_CONF_BASE_ADDRESS - mem_highest->base; + mem_highest->flags &= ~IORESOURCE_STORED; + amdk8_set_resource(dev, mem_highest, nodeid); }
compact_resources(dev);