From f12f292d91772bae72565dbb7224c04d403cdaa9 Mon Sep 17 00:00:00 2001 From: Matt DeVillier Date: Thu, 30 Oct 2025 15:06:13 -0500 Subject: [PATCH] mb/google/intel/*: Fix ACPI fan control FNP4 power resource The FNP4 power resource (minimum fan level) had both _ON and _OFF methods setting the same state (\FLVL = 4), violating ACPI power resource requirements where _OFF must transition to a state where _STA eventually returns 0 (OFF). This violation causes Windows to reject the thermal zone entirely due to its stricter ACPI compliance checking, resulting in non-functional fan control. Linux tolerates this bug, which is why it went unnoticed. Since FAN4 represents the minimum cooling state with no lower state to transition to, the correct implementation is to make _OFF a no-op. This maintains proper ACPI state machine semantics: after _ON, _STA returns 1; after _OFF, the system remains at minimum cooling (which is already the lowest valid state). This enables proper fan control operation on Windows while maintaining Linux compatibility. TEST=untested, but same as tested change on other mainboards in series. Change-Id: I5d6c5f6cb8232b956bbd1be6220b8bb09c32b480 Signed-off-by: Matt DeVillier Reviewed-on: https://review.coreboot.org/c/coreboot/+/89841 Tested-by: build bot (Jenkins) Reviewed-by: Felix Singer --- src/mainboard/intel/baskingridge/acpi/thermal.asl | 6 +++--- src/mainboard/intel/emeraldlake2/acpi/thermal.asl | 6 +++--- src/mainboard/intel/wtm2/acpi/thermal.asl | 5 +++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/mainboard/intel/baskingridge/acpi/thermal.asl b/src/mainboard/intel/baskingridge/acpi/thermal.asl index 5649d87a2c..fb015d17ca 100644 --- a/src/mainboard/intel/baskingridge/acpi/thermal.asl +++ b/src/mainboard/intel/baskingridge/acpi/thermal.asl @@ -196,9 +196,9 @@ Scope (\_TZ) Notify (\_TZ.THRM, 0x81) } Method (_OFF) { - \FLVL = 4 - \_SB.PCI0.LPCB.SIO.ENVC.F3PS = \F4PW - Notify (\_TZ.THRM, 0x81) + // FAN4 is the minimum cooling state (idle/lowest fan speed) + // There is no lower state to transition to, so _OFF is a no-op + // to maintain proper ACPI power resource state machine semantics } } diff --git a/src/mainboard/intel/emeraldlake2/acpi/thermal.asl b/src/mainboard/intel/emeraldlake2/acpi/thermal.asl index af6c41e572..d5149da549 100644 --- a/src/mainboard/intel/emeraldlake2/acpi/thermal.asl +++ b/src/mainboard/intel/emeraldlake2/acpi/thermal.asl @@ -215,9 +215,9 @@ Scope (\_TZ) Notify (\_TZ.THRM, 0x81) } Method (_OFF) { - \FLVL = 4 - \_SB.PCI0.LPCB.SIO.ENVC.F3PS = \F4PW - Notify (\_TZ.THRM, 0x81) + // FAN4 is the minimum cooling state (idle/lowest fan speed) + // There is no lower state to transition to, so _OFF is a no-op + // to maintain proper ACPI power resource state machine semantics } } diff --git a/src/mainboard/intel/wtm2/acpi/thermal.asl b/src/mainboard/intel/wtm2/acpi/thermal.asl index cb0388f924..3604805245 100644 --- a/src/mainboard/intel/wtm2/acpi/thermal.asl +++ b/src/mainboard/intel/wtm2/acpi/thermal.asl @@ -189,8 +189,9 @@ Scope (\_TZ) Notify (\_TZ.THRM, 0x81) } Method (_OFF) { - \FLVL = 4 - Notify (\_TZ.THRM, 0x81) + // FAN4 is the minimum cooling state (idle/lowest fan speed) + // There is no lower state to transition to, so _OFF is a no-op + // to maintain proper ACPI power resource state machine semantics } }