summaryrefslogtreecommitdiff
path: root/src/ec/lenovo
diff options
context:
space:
mode:
authorPatrick Rudolph <siro@das-labor.org>2017-08-27 17:46:52 +0200
committerNico Huber <nico.h@gmx.de>2017-11-04 19:10:29 +0000
commit0709dc0468951e2ed8fa8bac96d919147a926b74 (patch)
tree53ab51a8c2d897a93179f8913d1200fbba9329e7 /src/ec/lenovo
parent3ab13a8691cbe0e96c0741cb9bdf0e0acfa6efaf (diff)
downloadcoreboot-0709dc0468951e2ed8fa8bac96d919147a926b74.tar.xz
ec/lenovo/h8/acpi/thermal: Add ACPI fan control
Disengage the fan 10 degree below passive threshold as the automatic EC fan control does not disengage the FAN even when CPU starts melting ... * Add EC registers FAND and FANA. * Add ACPI methods _AC0 and _AL0. * Add fan device and PowerResource for fan control. Tested on Lenovo T430: * The fan disengages at 80°C and keeps running at full speed until temperature drops below 80°C. * Fan can be disengaged using sysfs: /sys/devics/virtual/thermal/cooling_device0/cur_state Tested on Lenovo T500: * The fan disengages at 80°C and keeps running at full speed until temperature drops below 80°C. * Fan cannot be disengaged using sysfs, but the current state can be read: /sys/devics/virtual/thermal/cooling_device0/cur_state Change-Id: I075ff5c69676927db1c5e731294e18796884f97e Signed-off-by: Patrick Rudolph <siro@das-labor.org> Reviewed-on: https://review.coreboot.org/21227 Reviewed-by: Nico Huber <nico.h@gmx.de> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/ec/lenovo')
-rw-r--r--src/ec/lenovo/h8/acpi/ec.asl4
-rw-r--r--src/ec/lenovo/h8/acpi/thermal.asl69
2 files changed, 67 insertions, 6 deletions
diff --git a/src/ec/lenovo/h8/acpi/ec.asl b/src/ec/lenovo/h8/acpi/ec.asl
index 5117264e89..0ed370f292 100644
--- a/src/ec/lenovo/h8/acpi/ec.asl
+++ b/src/ec/lenovo/h8/acpi/ec.asl
@@ -39,6 +39,10 @@ Device(EC)
DKR2, 1, /* Dock register 2 */
Offset (0x2a),
EVNT, 8, /* write will trigger EC event */
+ Offset (0x2f),
+ , 6,
+ FAND, 1, /* Fan disengage */
+ FANA, 1, /* Fan automatic mode enable */
Offset (0x30),
, 6,
ALMT, 1, /* Audio Mute + LED */
diff --git a/src/ec/lenovo/h8/acpi/thermal.asl b/src/ec/lenovo/h8/acpi/thermal.asl
index d43e3c6fbd..83c966af10 100644
--- a/src/ec/lenovo/h8/acpi/thermal.asl
+++ b/src/ec/lenovo/h8/acpi/thermal.asl
@@ -11,6 +11,8 @@
* GNU General Public License for more details.
*/
+#include <arch/x86/acpi/statdef.asl>
+
Scope(\_TZ)
{
#if defined (EC_LENOVO_H8_ME_WORKAROUND)
@@ -56,20 +58,30 @@ External (\PPKG, MethodObj)
Return (\PPKG ())
}
- Method (_CRT, 0, NotSerialized) {
+ /* Get critical temperature in degree celsius */
+ Method (GCRT, 0, NotSerialized) {
Store (\TCRT, Local0)
if (LGreater (Local0, 0)) {
- Return (C2K (Local0))
+ Return (Local0)
}
- Return (C2K (127))
+ Return (127)
}
- Method (_PSV, 0, NotSerialized) {
+ /* Get passive temperature in degree celsius */
+ Method (GPSV, 0, NotSerialized) {
Store (\TPSV, Local0)
if (LGreater (Local0, 0)) {
- Return (C2K(Local0))
+ Return (Local0)
}
- Return (C2K (95))
+ Return (95)
+ }
+
+ Method (_CRT, 0, NotSerialized) {
+ Return (C2K (GCRT ()))
+ }
+
+ Method (_PSV, 0, NotSerialized) {
+ Return (C2K (GPSV ()))
}
Method(_TMP) {
@@ -82,6 +94,51 @@ External (\PPKG, MethodObj)
#endif
Return (C2K(\_SB.PCI0.LPCB.EC.TMP0))
}
+
+ Method (_AC0) {
+ Store (GPSV (), Local0)
+
+ /* Active fan 10 degree below passive threshold */
+ Subtract (Local0, 10, Local0)
+
+ If (LEqual (\_SB.PCI0.LPCB.EC.FAND, 1)) {
+ /* Turn of 5 degree below trip point */
+ Subtract (Local0, 5, Local0)
+ }
+
+ Return (C2K (Local0))
+ }
+
+ Name (_AL0, Package () { FAN })
+
+ PowerResource (FPwR, 0, 0)
+ {
+ Method (_STA) {
+ If (LEqual (\_SB.PCI0.LPCB.EC.FAND, 0)) {
+ Return (Zero)
+ } Else {
+ Return (One)
+ }
+ }
+
+ Method (_ON) {
+ Store (One, \_SB.PCI0.LPCB.EC.FAND)
+ Store (Zero, \_SB.PCI0.LPCB.EC.FANA)
+ Notify (\_TZ.THM0, NOTIFY_TZ_TRIPPTCHG)
+ }
+
+ Method (_OFF) {
+ Store (Zero, \_SB.PCI0.LPCB.EC.FAND)
+ Store (One, \_SB.PCI0.LPCB.EC.FANA)
+ Notify (\_TZ.THM0, NOTIFY_TZ_TRIPPTCHG)
+ }
+ }
+
+ Device (FAN)
+ {
+ Name (_HID, EISAID ("PNP0C0B"))
+ Name (_PR0, Package () { FPwR })
+ }
}
ThermalZone(THM1)