Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5168
-gerrit
commit d74bd07cb3f2d277880599d471f2fadddc38831e
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Sat Feb 8 15:41:52 2014 -0600
mtrr: only add prefetchable resources as WRCOMB for VGA devices
Be more conservative and only add VGA devices' prefetchable
resources as write-combining in the address space. Previously
all prefetchable memory as added as a write-combining memory
type. Some hardware incorrectly advertises its BAR as
prefetchable when it shouldn't be.
A new memranges_add_resources_filter() function was added
to provide additional filtering on device and resource.
Change-Id: Id3d54a573a75b883286ef47759fbffa922b4a791
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
src/cpu/x86/mtrr/mtrr.c | 19 +++++++++++++++++--
src/include/memrange.h | 13 +++++++++++++
src/lib/memrange.c | 18 ++++++++++++++----
3 files changed, 44 insertions(+), 6 deletions(-)
diff --git a/src/cpu/x86/mtrr/mtrr.c b/src/cpu/x86/mtrr/mtrr.c
index dfb9c94..d85a869 100644
--- a/src/cpu/x86/mtrr/mtrr.c
+++ b/src/cpu/x86/mtrr/mtrr.c
@@ -30,6 +30,7 @@
#include <bootstate.h>
#include <console/console.h>
#include <device/device.h>
+#include <device/pci_ids.h>
#include <cpu/cpu.h>
#include <cpu/x86/msr.h>
#include <cpu/x86/mtrr.h>
@@ -154,6 +155,20 @@ static inline int range_entry_mtrr_type(struct range_entry *r)
return range_entry_tag(r) & MTRR_TAG_MASK;
}
+static int filter_vga_wrcomb(struct device *dev, struct resource *res)
+{
+ /* Only handle PCI devices. */
+ if (dev->path.type != DEVICE_PATH_PCI)
+ return 0;
+
+ /* Only handle VGA class devices. */
+ if (((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA))
+ return 0;
+
+ /* Add resource as write-combining in the address space. */
+ return 1;
+}
+
static struct memranges *get_physical_address_space(void)
{
static struct memranges *addr_space;
@@ -181,8 +196,8 @@ static struct memranges *get_physical_address_space(void)
* resources are appropriate for this MTRR type. */
match = IORESOURCE_PREFETCH;
mask |= match;
- memranges_add_resources(addr_space, mask, match,
- MTRR_TYPE_WRCOMB);
+ memranges_add_resources_filter(addr_space, mask, match, MTRR_TYPE_WRCOMB,
+ filter_vga_wrcomb);
#if CONFIG_CACHE_ROM
/* Add a write-protect region covering the ROM size
diff --git a/src/include/memrange.h b/src/include/memrange.h
index 4f094f5..ba85bef 100644
--- a/src/include/memrange.h
+++ b/src/include/memrange.h
@@ -94,6 +94,19 @@ void memranges_add_resources(struct memranges *ranges,
unsigned long mask, unsigned long match,
unsigned long tag);
+/* Add memory resources that match with the corresponding mask and match but
+ * also provide filter as additional check. The filter will return non-zero
+ * to add the resource or zero to not add the resource. Each entry will be
+ * tagged with the provided tag. e.g. To populate all cacheable memory
+ * resources in the range with a filter:
+ * memranges_add_resources_filter(range, IORESOURCE_CACHEABLE,
+ * IORESROUCE_CACHEABLE, my_cacheable_tag, filter); */
+typedef int (*memrange_filter_t)(struct device *dev, struct resource *res);
+void memranges_add_resources_filter(struct memranges *ranges,
+ unsigned long mask, unsigned long match,
+ unsigned long tag,
+ memrange_filter_t filter);
+
/* Fill all address ranges up to limit (exclusive) not covered by an entry by
* inserting new entries with the provided tag. */
void memranges_fill_holes_up_to(struct memranges *ranges,
diff --git a/src/lib/memrange.c b/src/lib/memrange.c
index 7fb6ef7..f0ff865 100644
--- a/src/lib/memrange.c
+++ b/src/lib/memrange.c
@@ -261,12 +261,14 @@ static void collect_ranges(void *gp, struct device *dev, struct resource *res)
if (res->size == 0)
return;
- memranges_insert(ctx->ranges, res->base, res->size, ctx->tag);
+ if (ctx->filter == NULL || ctx->filter(dev, res))
+ memranges_insert(ctx->ranges, res->base, res->size, ctx->tag);
}
-void memranges_add_resources(struct memranges *ranges,
- unsigned long mask, unsigned long match,
- unsigned long tag)
+void memranges_add_resources_filter(struct memranges *ranges,
+ unsigned long mask, unsigned long match,
+ unsigned long tag,
+ memrange_filter_t filter)
{
struct collect_context context;
@@ -276,9 +278,17 @@ void memranges_add_resources(struct memranges *ranges,
context.ranges = ranges;
context.tag = tag;
+ context.filter = filter;
search_global_resources(mask, match, collect_ranges, &context);
}
+void memranges_add_resources(struct memranges *ranges,
+ unsigned long mask, unsigned long match,
+ unsigned long tag)
+{
+ memranges_add_resources_filter(ranges, mask, match, tag, NULL);
+}
+
void memranges_init(struct memranges *ranges,
unsigned long mask, unsigned long match,
unsigned long tag)
Vladimir Serbinenko (phcoder(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5167
-gerrit
commit 78a421a772cefb1b9ca4a8f36768cdf481c8a289
Author: Vladimir Serbinenko <phcoder(a)gmail.com>
Date: Sat Feb 8 19:00:54 2014 +0100
NOTFORMERGE: lenovo/x201: Fix order of SPI init.
The lock bit for UVSVC/LVSVC was set before both registers were programmed.
Change-Id: I000440db5c8dd2f260ebc1b69108b75621faf7b3
Signed-off-by: Vladimir Serbinenko <phcoder(a)gmail.com>
---
src/mainboard/lenovo/x201/mainboard.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/mainboard/lenovo/x201/mainboard.c b/src/mainboard/lenovo/x201/mainboard.c
index c16c3a4..628c872 100644
--- a/src/mainboard/lenovo/x201/mainboard.c
+++ b/src/mainboard/lenovo/x201/mainboard.c
@@ -128,9 +128,9 @@ static void mainboard_enable(device_t dev)
RCBA32(0x389c) = 0x0601209f;
RCBA32(0x38b0) = 0x00000004;
RCBA32(0x38b4) = 0x03040002;
- RCBA32(0x38c0) = 0x00000007;
- RCBA32(0x38c4) = 0x00802005;
RCBA32(0x38c8) = 0x00002005;
+ RCBA32(0x38c4) = 0x00802005;
+ RCBA32(0x38c0) = 0x00000007;
RCBA32(0x3804) = 0x3f04e008;
printk(BIOS_SPEW, "SPI configured\n");
the following patch was just integrated into master:
commit 5b5f490383b543d222ed2d9cd9823287361336d9
Author: Vladimir Serbinenko <phcoder(a)gmail.com>
Date: Wed Feb 5 13:01:47 2014 +0100
boardstatus/towiki: Fix 1st gen i3/i5/i7 codename
It was a typo.
Change-Id: I82964b5ed7e7749ba141aeb3ee8dc4c107bcd7a9
Signed-off-by: Vladimir Serbinenko <phcoder(a)gmail.com>
See http://review.coreboot.org/5127 for details.
-gerrit