memranges: add memranges_update_tag() functionality

The memranges_update_tag() function replaces all instances
that are tagged with old_tag and update to new_tag. This
can be helpful in the MTRR code by adjusting the address
space if certain memory types cause the MTRR usage to
become too large.

Change-Id: Ie5c405204de2fdd9fd1dd5d6190b223925d6d318
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/5150
Tested-by: build bot (Jenkins)
Reviewed-by: Vladimir Serbinenko <phcoder@gmail.com>
diff --git a/src/lib/memrange.c b/src/lib/memrange.c
index af56e72..0ebac05 100644
--- a/src/lib/memrange.c
+++ b/src/lib/memrange.c
@@ -204,6 +204,19 @@
 	merge_neighbor_entries(ranges);
 }
 
+void memranges_update_tag(struct memranges *ranges, unsigned long old_tag,
+                          unsigned long new_tag)
+{
+	struct range_entry *r;
+
+	memranges_each_entry(r, ranges) {
+		if (range_entry_tag(r) == old_tag)
+			range_entry_update_tag(r, new_tag);
+	}
+
+	merge_neighbor_entries(ranges);
+}
+
 typedef void (*range_action_t)(struct memranges *ranges,
                                resource_t begin, resource_t end,
                                unsigned long tag);