diff options
author | Michael Niewöhner <foss@mniewoehner.de> | 2020-11-02 22:32:30 +0100 |
---|---|---|
committer | Nico Huber <nico.h@gmx.de> | 2020-11-20 00:10:44 +0000 |
commit | 275adeaf0ba4ce2255d6b767e55adf56ea358a50 (patch) | |
tree | 29d03020814fb0a1a56050295f79729eef656c43 /src/soc/intel/common/block | |
parent | 83806dd377301a8b5385e73bb7cc5ba541270977 (diff) |
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>
Diffstat (limited to 'src/soc/intel/common/block')
-rw-r--r-- | src/soc/intel/common/block/acpi/acpi/pep.asl | 20 |
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 64d23c1061..9e39a8fedd 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 |