See patch. Carl Daniel sent something very similar before... This one is
the same but adds some preprocessing sugar to it so it does the right
thing both for UMA and non-UMA cases
--
coresystems GmbH • Brahmsstr. 16 • D-79104 Freiburg i. Br.
Tel.: +49 761 7668825 • Fax: +49 761 7664613
Email: info@coresystems.de •
http://www.coresystems.de/
Registergericht: Amtsgericht Freiburg • HRB 7656
Geschäftsführer: Stefan Reinauer • Ust-IdNr.: DE245674866
Fix K8 boards high tables on UMA systems (KT690 for example)
Thanks to Carl-Daniel for pointing this out with some example code.
Signed-off-by: Stefan Reinauer
stepan@coresystems.de
Index: src/northbridge/amd/amdk8/northbridge.c
===================================================================
--- src/northbridge/amd/amdk8/northbridge.c (revision 4831)
+++ src/northbridge/amd/amdk8/northbridge.c (working copy)
@@ -837,7 +837,10 @@
#if CONFIG_WRITE_HIGH_TABLES==1
#define HIGH_TABLES_SIZE 64 // maximum size of high tables in KB
extern uint64_t high_tables_base, high_tables_size;
+#if CONFIG_GFXUMA == 1
+extern uint64_t uma_memory_base, uma_memory_size;
#endif
+#endif
static void amdk8_domain_set_resources(device_t dev)
{
@@ -1001,7 +1004,13 @@
}
+#if CONFIG_GFXUMA == 1
+ printk_debug("node %d : uma_memory_base/1024=0x%08x, mmio_basek=0x%08x, basek=0x%08x, limitk=0x%08x\n", i, uma_memory_base >> 10, mmio_basek, basek, limitk);
+ if ((uma_memory_base >> 10) < mmio_basek)
+ printk_alert("node %d: UMA memory starts below mmio_basek\n", i);
+#else
// printk_debug("node %d : mmio_basek=%08x, basek=%08x, limitk=%08x\n", i, mmio_basek, basek, limitk); //yhlu
+#endif
/* See if I need to split the region to accomodate pci memory space */
if ( (basek < 4*1024*1024 ) && (limitk > mmio_basek) ) {
@@ -1015,7 +1024,11 @@
#if CONFIG_WRITE_HIGH_TABLES==1
if (i==0 && high_tables_base==0) {
/* Leave some space for ACPI, PIRQ and MP tables */
+#if CONFIG_GFXUMA == 1
+ high_tables_base = ((uma_memory_base >> 10) - HIGH_TABLES_SIZE) * 1024;
+#else
high_tables_base = (mmio_basek - HIGH_TABLES_SIZE) * 1024;
+#endif
high_tables_size = HIGH_TABLES_SIZE * 1024;
printk_debug(" split: %dK table at =%08llx\n", HIGH_TABLES_SIZE,
high_tables_base);
@@ -1051,7 +1064,11 @@
i, mmio_basek, basek, limitk);
if (i==0 && high_tables_base==0) {
/* Leave some space for ACPI, PIRQ and MP tables */
+#if CONFIG_GFXUMA == 1
+ high_tables_base = ((uma_memory_base >> 10) - HIGH_TABLES_SIZE) * 1024;
+#else
high_tables_base = (limitk - HIGH_TABLES_SIZE) * 1024;
+#endif
high_tables_size = HIGH_TABLES_SIZE * 1024;
}
#endif