Timothy Pearson (tpearson(a)raptorengineeringinc.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8259
-gerrit
commit eb3150e6cc6f8dfa7ea63ef37a97a575732b4789
Author: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
Date: Fri Jan 23 20:18:56 2015 -0600
ACPI: Fix corrupt SSDT table on multiprocessor AMD Family 10h systems
Signed-off-by: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
Change-Id: I3175c8b29e94a27a2db6b11f8fc9e1d91bde11f9
---
src/northbridge/amd/amdfam10/acpi.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/src/northbridge/amd/amdfam10/acpi.c b/src/northbridge/amd/amdfam10/acpi.c
index 463fb7c..23308d8 100644
--- a/src/northbridge/amd/amdfam10/acpi.c
+++ b/src/northbridge/amd/amdfam10/acpi.c
@@ -1,6 +1,7 @@
/*
* This file is part of the coreboot project.
*
+ * Copyright (C) 2015 Timothy Pearson <tpearson(a)raptorengineeringinc.com>, Raptor Engineering
* Copyright (C) 2007 Advanced Micro Devices, Inc.
*
* This program is free software; you can redistribute it and/or modify
@@ -187,6 +188,22 @@ void update_ssdtx(void *ssdtx, int i)
void northbridge_acpi_write_vars(void)
{
+ /*
+ * If more than one physical CPU is installed, northbridge_acpi_write_vars()
+ * is called more than once and the resultant SSDT table is corrupted
+ * (duplicated entries).
+ * This prevents Linux from booting, with log messages like these:
+ * ACPI Error: [BUSN] Namespace lookup failure, AE_ALREADY_EXISTS (/dswload-353)
+ * ACPI Exception: AE_ALREADY_EXISTS, During name lookup/catalog (/psobject-222)
+ * followed by a slew of ACPI method failures and a hang when the invalid PCI
+ * resource entries are used.
+ * This routine prevents the SSDT table from being corrupted.
+ */
+ static char ssdt_generated = 0;
+ if (ssdt_generated)
+ return;
+ ssdt_generated = 1;
+
msr_t msr;
char pscope[] = "\\_SB.PCI0";
int i;
Timothy Pearson (tpearson(a)raptorengineeringinc.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8261
-gerrit
commit e86fe1e676c2730391ba3b97cd41bbd3030ecf54
Author: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
Date: Fri Jan 23 20:20:56 2015 -0600
device/device.c: Correct PCI register space location
Fix the incorrect PCI register space location causing corruption
with more than ~3.5GB physical RAM on AMD Family 10h systems.
Change-Id: I66d1bfa1e977a6b492c1909079087a801c7e6a3a
Signed-off-by: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
---
src/device/device.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/src/device/device.c b/src/device/device.c
index 00e323a..94390b7 100644
--- a/src/device/device.c
+++ b/src/device/device.c
@@ -13,6 +13,7 @@
* (Written by Yinghai Lu <yhlu(a)tyan.com> for Tyan)
* Copyright (C) 2005-2006 Stefan Reinauer <stepan(a)openbios.org>
* Copyright (C) 2009 Myles Watson <mylesgw(a)gmail.com>
+ * Copyright (C) 2015 Timothy Pearson <tpearson(a)raptorengineeringinc.com>, Raptor Engineering
*/
/*
@@ -685,6 +686,25 @@ static void constrain_resources(struct device *dev, struct constraints* limits)
}
}
+/*
+ * In this function there is a provision to shrink the potential PCI address
+ * space to the resource specified value.
+ *
+ * Without this the PCI address space attempts to reserve roughly all 32-bit
+ * addressable RAM, leading to allocation below the AMD fixed resource window
+ * instead of above it. When allocated below the fixed resource window it
+ * is not protected by the e820 map and the PCI configuration is overwritten,
+ * causing all PCI devices to become unusable!
+ *
+ * This bug is only exposed when the top of system RAM touches the bottom of
+ * the fixed resource window. If less than ~3.5GB of memory is installed there
+ * is a gap between system RAM and the fixed resource window which protects
+ * the incorrectly allocated PCI configuration registers and hides this bug.
+ *
+ * On non-AMD systems this may not matter as much, but the code below is generic
+ * and should not harm other systems.
+ */
+
static void avoid_fixed_resources(struct device *dev)
{
struct constraints limits;
@@ -712,6 +732,12 @@ static void avoid_fixed_resources(struct device *dev)
if ((res->flags & MEM_MASK) == MEM_TYPE &&
(res->limit < limits.mem.limit))
limits.mem.limit = res->limit;
+ /* Shrink PCI address space */
+ if ((res->flags & MEM_MASK) == MEM_TYPE &&
+ (res->size < (limits.mem.limit - limits.mem.base + 1))) {
+ limits.mem.base = (limits.mem.limit - res->size + 1);
+ limits.mem.size = res->size;
+ }
if ((res->flags & IO_MASK) == IO_TYPE &&
(res->limit < limits.io.limit))
limits.io.limit = res->limit;