summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niewöhner <foss@mniewoehner.de>2020-11-02 22:32:30 +0100
committerNico Huber <nico.h@gmx.de>2020-11-20 00:10:44 +0000
commit275adeaf0ba4ce2255d6b767e55adf56ea358a50 (patch)
tree29d03020814fb0a1a56050295f79729eef656c43
parent83806dd377301a8b5385e73bb7cc5ba541270977 (diff)
downloadcoreboot-275adeaf0ba4ce2255d6b767e55adf56ea358a50.tar.gz
coreboot-275adeaf0ba4ce2255d6b767e55adf56ea358a50.tar.bz2
coreboot-275adeaf0ba4ce2255d6b767e55adf56ea358a50.zip
soc/intel/common/acpi: work around Windows crash on S0ix-enabled boards
Windows does not comply with the Low Power Idle S0 specification and crashes with an `INTERNAL_POWER_ERROR` bluescreen when function 1, does not return at least one device constraint, even when function 1 is announced as being not available by the enum function. Returning an empty package does not work. At least the following Windows versions were verified to be affected: - Windows 8.1 x64, release 6.3.9600 - Windoes 10 x64, version 1809, build 17763.379 - Windows 10 x64, version 1903, build 18362.53 - Windows 10 x64, version 2004, build 19041.508 - Windows 10 x64, version 20H2 / 2009, build 19042.450 To make Windows work on S0ix-enabled boards, return a dummy constraint package with a disabled dummy device. Since the device constraints are only used for debugging low power states in Linux and probably also in Windows, there shouldn't be any negative effect to S0ix. Real device constraint entries could be added at a later point, if needed. Note: to fully prevent the BSOD mentioned above the LPIT table is required on Windows, too. The patch for this is WIP, see CB:32350. If you want to test this, you need to applie the whole ACPI patch series including the hacky LPIT test implementation from CB:47242: https://review.coreboot.org/q/topic:%22low_power_idle_fix%22 Test: no bluescreen anymore on Clevo L140CU on all Windows versions listed above and S0ix gets detected in `powercfg -a`. Change-Id: Icd08cbcb1dfcb8cbb23f4f4c902bf8c367c8e3ac Signed-off-by: Michael Niewöhner <foss@mniewoehner.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/47138 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Furquan Shaikh <furquan@google.com>
-rw-r--r--src/soc/intel/common/block/acpi/acpi/pep.asl20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/soc/intel/common/block/acpi/acpi/pep.asl b/src/soc/intel/common/block/acpi/acpi/pep.asl
index 64d23c106122..9e39a8feddf6 100644
--- a/src/soc/intel/common/block/acpi/acpi/pep.asl
+++ b/src/soc/intel/common/block/acpi/acpi/pep.asl
@@ -30,9 +30,27 @@ Device(PEPD)
}
/*
* Function 1 - Get Device Constraints
+ *
+ * Device constraints for low power states (may be used for debugging).
+ * For now there is only one disabled dummy device, because Windows
+ * expects at least one device and crashes without it with a bluescreen
+ * (`INTERNAL_POWER_ERROR`). Returning an empty package does not work.
*/
If(Arg2 == PEPD_DSM_LPI_GET_DEVICE_CONSTRAINTS) {
- Return(Package(5) {0, Ones, Ones, Ones, Ones})
+ Return (Package() {
+ Package() {
+ "\\DUMY", /* \DUMY - not existent */
+ 0, /* disabled, no constraints */
+ Package() {
+ 0, /* revision */
+ Package() {
+ 0xff, /* apply to all LPIT states */
+ 0 /* minimum D-state */
+ }
+ }
+ }
+ }
+ )
}
/*
* Function 2 - Get Crash Dump Device