Kyösti Mälkki (kyosti.malkki@gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/1488
-gerrit
commit 23204c0f9fcf0467eca018a63a040aa924eb0453 Author: Kyösti Mälkki kyosti.malkki@gmail.com Date: Mon Aug 27 20:00:33 2012 +0300
Fix AMD UMA for RS780
In commit 6b5eb1cc2d1702ff10cd02249d3d861c094f9118 setup of UMA memory region was moved to happen at a later state and this broke UMA with RS780 southbridge.
Share the TOP_MEM and UMA settings before any of the PCI or CPU scanning takes place.
Change-Id: I9cae1fc2948cbccede58d099faf1dfe49e9df303 Signed-off-by: Kyösti Mälkki kyosti.malkki@gmail.com --- src/northbridge/amd/agesa/family10/northbridge.c | 18 +++++++++++++----- src/northbridge/amd/agesa/family12/northbridge.c | 13 ++++++++++--- src/northbridge/amd/agesa/family14/northbridge.c | 16 ++++++++++++---- src/northbridge/amd/agesa/family15/northbridge.c | 13 ++++++++++--- src/northbridge/amd/agesa/family15tn/northbridge.c | 13 ++++++++++--- src/northbridge/amd/amdfam10/northbridge.c | 13 ++++++++++--- src/northbridge/amd/amdk8/northbridge.c | 13 ++++++++++--- 7 files changed, 75 insertions(+), 24 deletions(-)
diff --git a/src/northbridge/amd/agesa/family10/northbridge.c b/src/northbridge/amd/agesa/family10/northbridge.c index 4b3859b..528ee95 100644 --- a/src/northbridge/amd/agesa/family10/northbridge.c +++ b/src/northbridge/amd/agesa/family10/northbridge.c @@ -923,11 +923,6 @@ static void amdfam10_domain_set_resources(device_t dev) u32 reset_memhole = 1; #endif
- setup_bsp_ramtop(); -#if CONFIG_GFXUMA -#error Northbridge does not set uma_memory_base or uma_memory_size. -#endif - #if CONFIG_PCI_64BIT_PREF_MEM
for (link = dev->link_list; link; link = link->next) { @@ -1464,6 +1459,19 @@ static struct device_operations cpu_bus_ops = {
static void root_complex_enable_dev(struct device *dev) { + static int done = 0; + + /* Do not delay UMA setup, as a device on the PCI bus may evaluate + the global uma_memory variables already in its enable function. */ + if (!done) { + setup_bsp_ramtop(); +#if CONFIG_GFXUMA +#error Northbridge does not set uma_memory_base or uma_memory_size. + setup_uma_memory(); +#endif + done = 1; + } + /* Set the operations if it is a special bus type */ if (dev->path.type == DEVICE_PATH_PCI_DOMAIN) { dev->ops = &pci_domain_ops; diff --git a/src/northbridge/amd/agesa/family12/northbridge.c b/src/northbridge/amd/agesa/family12/northbridge.c index 6689e71..7f14787 100644 --- a/src/northbridge/amd/agesa/family12/northbridge.c +++ b/src/northbridge/amd/agesa/family12/northbridge.c @@ -601,9 +601,6 @@ static void domain_set_resources(device_t dev) u32 reset_memhole = 1; #endif
- setup_bsp_ramtop(); - setup_uma_memory(); - #if CONFIG_PCI_64BIT_PREF_MEM
printk(BIOS_DEBUG, "adsr - CONFIG_PCI_64BIT_PREF_MEM is true.\n"); @@ -914,6 +911,16 @@ static struct device_operations cpu_bus_ops = { static void root_complex_enable_dev(struct device *dev) { printk(BIOS_DEBUG, "\nFam12h - northbridge.c - root_complex_enable_dev - Start.\n"); + static int done = 0; + + /* Do not delay UMA setup, as a device on the PCI bus may evaluate + the global uma_memory variables already in its enable function. */ + if (!done) { + setup_bsp_ramtop(); + setup_uma_memory(); + done = 1; + } + /* Set the operations if it is a special bus type */ if (dev->path.type == DEVICE_PATH_PCI_DOMAIN) { dev->ops = &pci_domain_ops; diff --git a/src/northbridge/amd/agesa/family14/northbridge.c b/src/northbridge/amd/agesa/family14/northbridge.c index 875dbbb..e878b4f 100644 --- a/src/northbridge/amd/agesa/family14/northbridge.c +++ b/src/northbridge/amd/agesa/family14/northbridge.c @@ -564,9 +564,6 @@ static void domain_set_resources(device_t dev) u32 reset_memhole = 1; #endif
- setup_bsp_ramtop(); - setup_uma_memory(); - #if CONFIG_PCI_64BIT_PREF_MEM
printk(BIOS_DEBUG, "adsr - CONFIG_PCI_64BIT_PREF_MEM is true.\n"); @@ -905,7 +902,18 @@ static struct device_operations cpu_bus_ops = { .scan_bus = cpu_bus_scan, };
-static void root_complex_enable_dev(struct device *dev) { +static void root_complex_enable_dev(struct device *dev) +{ + static int done = 0; + + /* Do not delay UMA setup, as a device on the PCI bus may evaluate + the global uma_memory variables already in its enable function. */ + if (!done) { + setup_bsp_ramtop(); + setup_uma_memory(); + done = 1; + } + /* Set the operations if it is a special bus type */ if (dev->path.type == DEVICE_PATH_PCI_DOMAIN) { dev->ops = &pci_domain_ops; diff --git a/src/northbridge/amd/agesa/family15/northbridge.c b/src/northbridge/amd/agesa/family15/northbridge.c index 96cfca2..b36af80 100644 --- a/src/northbridge/amd/agesa/family15/northbridge.c +++ b/src/northbridge/amd/agesa/family15/northbridge.c @@ -673,9 +673,6 @@ static void domain_set_resources(device_t dev) u32 reset_memhole = 1; #endif
- setup_bsp_ramtop(); - setup_uma_memory(); - #if CONFIG_PCI_64BIT_PREF_MEM
for (link = dev->link_list; link; link = link->next) { @@ -1147,6 +1144,16 @@ static struct device_operations cpu_bus_ops = {
static void root_complex_enable_dev(struct device *dev) { + static int done = 0; + + /* Do not delay UMA setup, as a device on the PCI bus may evaluate + the global uma_memory variables already in its enable function. */ + if (!done) { + setup_bsp_ramtop(); + setup_uma_memory(); + done = 1; + } + /* Set the operations if it is a special bus type */ if (dev->path.type == DEVICE_PATH_PCI_DOMAIN) { dev->ops = &pci_domain_ops; diff --git a/src/northbridge/amd/agesa/family15tn/northbridge.c b/src/northbridge/amd/agesa/family15tn/northbridge.c index fb30277..eaba650 100644 --- a/src/northbridge/amd/agesa/family15tn/northbridge.c +++ b/src/northbridge/amd/agesa/family15tn/northbridge.c @@ -684,9 +684,6 @@ static void domain_set_resources(device_t dev) u32 reset_memhole = 1; #endif
- setup_bsp_ramtop(); - setup_uma_memory(); - #if CONFIG_PCI_64BIT_PREF_MEM
for (link = dev->link_list; link; link = link->next) { @@ -1154,6 +1151,16 @@ static struct device_operations cpu_bus_ops = {
static void root_complex_enable_dev(struct device *dev) { + static int done = 0; + + /* Do not delay UMA setup, as a device on the PCI bus may evaluate + the global uma_memory variables already in its enable function. */ + if (!done) { + setup_bsp_ramtop(); + setup_uma_memory(); + done = 1; + } + /* Set the operations if it is a special bus type */ if (dev->path.type == DEVICE_PATH_PCI_DOMAIN) { dev->ops = &pci_domain_ops; diff --git a/src/northbridge/amd/amdfam10/northbridge.c b/src/northbridge/amd/amdfam10/northbridge.c index 865a3bc..500c4ed 100644 --- a/src/northbridge/amd/amdfam10/northbridge.c +++ b/src/northbridge/amd/amdfam10/northbridge.c @@ -888,9 +888,6 @@ static void amdfam10_domain_set_resources(device_t dev) u32 reset_memhole = 1; #endif
- setup_bsp_ramtop(); - setup_uma_memory(); - #if CONFIG_PCI_64BIT_PREF_MEM
for(link = dev->link_list; link; link = link->next) { @@ -1489,6 +1486,16 @@ static struct device_operations cpu_bus_ops = {
static void root_complex_enable_dev(struct device *dev) { + static int done = 0; + + /* Do not delay UMA setup, as a device on the PCI bus may evaluate + the global uma_memory variables already in its enable function. */ + if (!done) { + setup_bsp_ramtop(); + setup_uma_memory(); + done = 1; + } + /* Set the operations if it is a special bus type */ if (dev->path.type == DEVICE_PATH_PCI_DOMAIN) { dev->ops = &pci_domain_ops; diff --git a/src/northbridge/amd/amdk8/northbridge.c b/src/northbridge/amd/amdk8/northbridge.c index d94ee9a..5fbbbc1 100644 --- a/src/northbridge/amd/amdk8/northbridge.c +++ b/src/northbridge/amd/amdk8/northbridge.c @@ -884,9 +884,6 @@ static void amdk8_domain_set_resources(device_t dev) u32 reset_memhole = 1; #endif
- setup_bsp_ramtop(); - setup_uma_memory(); - #if 0 /* Place the IO devices somewhere safe */ io = find_resource(dev, 0); @@ -1378,6 +1375,16 @@ static struct device_operations cpu_bus_ops = {
static void root_complex_enable_dev(struct device *dev) { + static int done = 0; + + /* Do not delay UMA setup, as a device on the PCI bus may evaluate + the global uma_memory variables already in its enable function. */ + if (!done) { + setup_bsp_ramtop(); + setup_uma_memory(); + done = 1; + } + /* Set the operations if it is a special bus type */ if (dev->path.type == DEVICE_PATH_PCI_DOMAIN) { dev->ops = &pci_domain_ops;