summaryrefslogtreecommitdiff
path: root/src/cpu/amd/mtrr
diff options
context:
space:
mode:
authorKyösti Mälkki <kyosti.malkki@gmail.com>2012-07-10 13:10:24 +0300
committerPatrick Georgi <patrick@georgi-clan.de>2012-07-16 18:57:43 +0200
commitde3dde46fd3efaba65656509d4221f29a66257a3 (patch)
treed643f39c97eae756c190c98352ad04382d536a18 /src/cpu/amd/mtrr
parent2354515f2e9ebf46fca2dc0e3c434940aaac6e9b (diff)
downloadcoreboot-de3dde46fd3efaba65656509d4221f29a66257a3.tar.xz
AMD: Fix GFXUMA with 4GB or more RAM
Northbridge code incorrectly adjusted the last cacheable memory resource to accomodate room for UMA framebuffer. If system had 4GB or more memory that last resource is not below 4GB and not the one where UMA is located. There are three consequences: The last entry in coreboot memory table is reduced by uma_memory_size. Due the incorrect code in northbridge code state.tomk, end of last resource below 4GB, had not been adjusted. Incrementing that by uma_memory_size diverts a region possibly claimed for MMIO to RAM, as TOP_MEM is written. Since the UMA framebuffer did not have IORESOURCE_CACHEABLE, it was ignored from the MTRR setup and not set uncacheable. The setting of TOP_MEM and TOP_MEM2, as well as all the MTRRs, should be copied from BSP to all APs instead of deriving the data separately for each Logical CPU. Change-Id: I8e69fc8854b776fe9e4fe6ddfb101eba14888939 Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: http://review.coreboot.org/1217 Tested-by: build bot (Jenkins) Reviewed-by: Denis Carikli <GNUtoo@no-log.org> Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
Diffstat (limited to 'src/cpu/amd/mtrr')
-rw-r--r--src/cpu/amd/mtrr/amd_mtrr.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/cpu/amd/mtrr/amd_mtrr.c b/src/cpu/amd/mtrr/amd_mtrr.c
index ec72425693..f639d59bad 100644
--- a/src/cpu/amd/mtrr/amd_mtrr.c
+++ b/src/cpu/amd/mtrr/amd_mtrr.c
@@ -102,6 +102,20 @@ static void set_fixed_mtrr_resource(void *gp, struct device *dev, struct resourc
}
+static void uma_fb_resource(void *gp, struct device *dev, struct resource *res)
+{
+ struct mem_state *state = gp;
+ unsigned long topk;
+
+ topk = resk(res->base + res->size);
+ if (state->tom2k < topk) {
+ state->tom2k = topk;
+ }
+ if ((topk < 4*1024*1024) && (state->tomk < topk)) {
+ state->tomk = topk;
+ }
+}
+
void amd_setup_mtrrs(void)
{
unsigned long address_bits;
@@ -133,6 +147,9 @@ void amd_setup_mtrrs(void)
state.tomk = state.tom2k = 0;
search_global_resources(
+ IORESOURCE_MEM | IORESOURCE_UMA_FB, IORESOURCE_MEM | IORESOURCE_UMA_FB,
+ uma_fb_resource, &state);
+ search_global_resources(
IORESOURCE_MEM | IORESOURCE_CACHEABLE, IORESOURCE_MEM | IORESOURCE_CACHEABLE,
set_fixed_mtrr_resource, &state);
@@ -144,13 +161,6 @@ void amd_setup_mtrrs(void)
state.tomk = (state.tomk + TOP_MEM_MASK_KB) & ~TOP_MEM_MASK_KB;
msr.hi = state.tomk >> 22;
msr.lo = state.tomk << 10;
- /* If UMA graphics is enabled, the frame buffer memory
- * has been deducted from the size of memory below 4GB.
- * When setting TOM, include UMA DRAM
- */
- #if CONFIG_GFXUMA
- msr.lo += uma_memory_size;
- #endif
wrmsr(TOP_MEM, msr);
/* if DRAM above 4GB: set SYSCFG_MSR_TOM2En and SYSCFG_MSR_TOM2WB */