summaryrefslogtreecommitdiff
path: root/src/mainboard/asrock/e350m1
diff options
context:
space:
mode:
authorScott Duplichan <scott@notabs.org>2011-07-09 20:14:20 -0500
committerPeter Stuge <peter@stuge.se>2011-07-10 18:31:29 +0200
commit7d6f0bf10efbb3139c56e1e124370b1a29edc6ea (patch)
tree634df8f3e2b6b3f15d5151d4de6a9928d746fecb /src/mainboard/asrock/e350m1
parent1fe6c64ba136697a14fbefa6b0b70b1e8fe1fa0f (diff)
ASRock E350M1: ACPI-related BSOD fix
On installing/starting Windows (tested with Win7 Ultimate) the system crashes with a Blue Screen of Death, reporting an ACPI BIOS error. From Scott Duplichan: To avoid the Windows BSOD, the uninitialized value TOM1 in the SSDT must be corrected. The attached patch does this. It uses the older patching method, and not the (possibly preferred) AML generation method. To simplify the patching operation, I moved the AML item 'TOM1' to the start of the SSDT. The patch also includes code to confirm the AML variable TOM1 is at the expected offset before patching. Also tested & working with Linux. Change-Id: I59cedc366e09d98f690b093d6a21fc0c864559c3 Signed-off-by: Scott Duplichan <scott@notabs.org> Acked-by: Marshall Buschman <mbuschman@lucidmachines.com> Reviewed-on: http://review.coreboot.org/91 Tested-by: build bot (Jenkins) Reviewed-by: Peter Stuge <peter@stuge.se>
Diffstat (limited to 'src/mainboard/asrock/e350m1')
-rw-r--r--src/mainboard/asrock/e350m1/acpi_tables.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/mainboard/asrock/e350m1/acpi_tables.c b/src/mainboard/asrock/e350m1/acpi_tables.c
index 20b0dc2f60..cd0a996861 100644
--- a/src/mainboard/asrock/e350m1/acpi_tables.c
+++ b/src/mainboard/asrock/e350m1/acpi_tables.c
@@ -185,6 +185,11 @@ unsigned long write_acpi_tables(unsigned long start)
memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
current += ssdt->length;
memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
+
+ char *position = ssdt;
+ if (memcmp (position + 50, "TOM1", 4) == 0)
+ *(u32 *) (position + 55) = __readmsr (0xc001001a);
+
/* recalculate checksum */
ssdt->checksum = 0;
ssdt->checksum = acpi_checksum((unsigned char *)ssdt,ssdt->length);