Check for IORESOURCE_UMA_FB in MTRR setup

If northbridge called uma_resource() a resource of this type
should be found when walking the resources list.

For now, be rude and don't even try to combine it with
neighboring regions. As the type is un-cacheable it is
dominant over other MTRR setups claiming the same region.

Change-Id: I57805e7e7da0709f8ed78d8df62c2abf22172a06
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: http://review.coreboot.org/1215
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
diff --git a/src/cpu/x86/mtrr/mtrr.c b/src/cpu/x86/mtrr/mtrr.c
index 1ffec0eb..77fdb6f 100644
--- a/src/cpu/x86/mtrr/mtrr.c
+++ b/src/cpu/x86/mtrr/mtrr.c
@@ -352,8 +352,20 @@
 	unsigned long basek, sizek;
 	if (state->reg >= bios_mtrrs)
 		return;
+
 	basek = resk(res->base);
 	sizek = resk(res->size);
+
+	if (res->flags & IORESOURCE_UMA_FB) {
+		/* FIXME: could I use Write-Combining for Frame Buffer ? */
+		state->reg = range_to_mtrr(state->reg,	basek, sizek, 0,
+			MTRR_TYPE_UNCACHEABLE, state->address_bits, state->above4gb);
+		return;
+	}
+
+	if (!(res->flags & IORESOURCE_CACHEABLE))
+		return;
+
 	/* See if I can merge with the last range
 	 * Either I am below 1M and the fixed mtrrs handle it, or
 	 * the ranges touch.
@@ -451,23 +463,9 @@
 	if (above4gb == 2)
 		detect_var_mtrrs();
 
-	search_global_resources(
-		IORESOURCE_MEM | IORESOURCE_CACHEABLE, IORESOURCE_MEM | IORESOURCE_CACHEABLE,
+	search_global_resources(IORESOURCE_MEM, IORESOURCE_MEM,
 		set_var_mtrr_resource, &var_state);
 
-#if CONFIG_GFXUMA /* UMA or SP. */
-	/* For now we assume the UMA space is at the end of memory below 4GB */
-	if (var_state.hole_startk || var_state.hole_sizek) {
-		printk(BIOS_DEBUG, "Warning: Can't set up MTRR hole for UMA due to pre-existing MTRR hole.\n");
-	} else {
-		// Increase the base range and set up UMA as an UC hole instead
-		if (above4gb != 2)
-			var_state.range_sizek += (uma_memory_size >> 10);
-
-		var_state.hole_startk = (uma_memory_base >> 10);
-		var_state.hole_sizek = (uma_memory_size >> 10);
-	}
-#endif
 	/* Write the last range */
 	var_state.reg = range_to_mtrr(var_state.reg, var_state.range_startk,
 		var_state.range_sizek, 0, MTRR_TYPE_WRBACK,