WARNING: Everything is not properly tested and you might end up completely turning off the fans! In the worst case, do a complete Shutdown of your computer to reset the fan values.

Tools you need

FAN CONTROL

as long as the fan(s) are in AUTOMATIC mode.

Once again, you can only see the speed of the fan if it is in automatic fan speed mode (default). You cannot see speed of the fan in manual fan speed mode (user changed using SFNV).

General: Differences in laptop models

Fan speed

Please note: speed will not be reported if the fan is in set to MANUAL speed mode using SFNV.

Code: \_SB.PCI0.LPCB.EC0.TACH Arg0

Code: Method (TACH, 1, Serialized) { Name (_T_0, Zero) If (ECAV ()) { While (One) { Store (Arg0, _T_0) If (LEqual (_T_0, Zero)) { Store (TAH0, Local0) Break } Else { If (LEqual (_T_0, One)) { Store (TAH1, Local0) Break } Else { Return (Ones) } } Break } Multiply (Local0, 0x02, Local0) If (LNotEqual (Local0, Zero)) { Divide (0x0041CDB4, Local0, Local1, Local0) Return (Local0) } Else { Return (Ones) } } Else { Return (Ones) } }

Code: \_TZ.RFAN

Code: Method (RFAN, 1, NotSerialized) { If (\_SB.PCI0.LPCB.EC0.ECAV ()) { Store (\_SB.PCI0.LPCB.EC0.ST83 (Arg0), Local0) // Gets the fan speed. 0x0 - OFF, 0x5a, 0x62, 0x79, 0xFF-reporting disabled? If (LEqual (Local0, 0xFF)) { Return (Local0) } Store (\_SB.PCI0.LPCB.EC0.TACH (Arg0), Local0) Divide (Local0, 0x64, Local1, Local0) Add (Local0, One, Local0) If (LLessEqual (Local0, 0x3C)) { Store (Local0, FANS) } Else { Store (FANS, Local0) } } Else { Store (Zero, Local0) } Return (Local0) }

Code: \_SB.PCI0.LPCB.EC0.TAH0 //for Fan1 \_SB.PCI0.LPCB.EC0.TAH1 // for Fan2

Code: OperationRegion (ECOR, EmbeddedControl, Zero, 0xFF) Field (ECOR, ByteAcc, Lock, Preserve) { ....... Offset (0x93), TAH0, 16, // Fan0 Tachometer TAH1, 16, // Fan1 Tachometer TSTP, 8, // some sort of Fan control. 0x1 if fan(s) on, 0x0 if fan(s) off, maybe other values... ....... }

Fan maximum speed

This setting affects the fan speed both in manual and in automatic fan speed mode

The "hacky" method:

Code: \_SB.PCI0.LPCB.EC0.ST98 Arg0

The clean method (how it should be done, ideally):

Code: \_SB.QFAN // some place in SystemMemory

Code: \_SB.ATKD.QMOD Arg0

Code: Method (QMOD, 1, NotSerialized) { If (LEqual (Arg0, Zero)) { Return (One) } If (LEqual (Arg0, One)) { ^^PCI0.LPCB.EC0.ST98 (QFAN) } If (LEqual (Arg0, 0x02)) { ^^PCI0.LPCB.EC0.ST98 (0xFF) } Return (One) }

Fan speed MANUAL

WARNING: When fan speed is set to custom value, the fan is not properly powered down when in Standby (you can hear high pitch sound coming from the fan), therefore you must set it back to AUTO before going into Standby and the resume the manual values after.

Code: \_SB.PCI0.LPCB.EC0.SFNV Arg0 Arg1

Code: \_SB.PCI0.LPCB.EC0.SFNV 1 0x7D //set Fan1 speed to 0x7D (125) \_SB.PCI0.LPCB.EC0.SFNV 2 0x00 //set Fan1 speed to 0x00 (0) \_SB.PCI0.LPCB.EC0.SFNV 0 0 //reset fans back to Automatic fan control

Code: Name (DECF, Zero) // stores which fans were set to manual control, for later resetting back to auto Method (SFNV, 2, Serialized) { If (LEqual (Arg0, Zero)) { If (And (DECF, One)) // reset Fan1 back to Auto speed control { Store (RRAM (0x0521), Local0) Or (Local0, 0x80, Local0) WRAM (0x0521, Local0) // 0x8d auto ON/OFF } If (And (DECF, 0x02)) // reset Fan2 back to Auto speed control { Store (RRAM (0x0522), Local0) Or (Local0, 0x80, Local0) WRAM (0x0522, Local0) // 0x8e auto ON/OFF } Store (Zero, DECF) Return (Zero) } If (LEqual (Arg0, One)) // set fan speed manually for Fan1 { Store (RRAM (0x0521), Local0) And (Local0, 0x7F, Local0) WRAM (0x0521, Local0) // 0xd manually set Or (DECF, One, DECF) ST84 (Zero, Arg1) Return (Zero) } If (LEqual (Arg0, 0x02)) // set fan speed manually for Fan2 { Store (RRAM (0x0522), Local0) And (Local0, 0x7F, Local0) WRAM (0x0522, Local0) // 0xe manually set Or (DECF, 0x02, DECF) ST84 (One, Arg1) Return (Zero) } Return (Zero) }

Reset fan speed back to AUTO

Code: \_SB.ATKD.QMOD 0x02

Code: \_SB.PCI0.LPCB.EC0.SFNV 0 0

TEMPERATURE

CPU temperature

Code: \_SB.PCI0.LPCB.EC0.ECPU

Code: IndexField (BRAI, BRAD, ByteAcc, NoLock, Preserve) { ..... Offset (0x98), ECPU, 8, // CPU Current temerature ECRT, 8, // CPU Critical Temperature (Tj Max) EPSV, 8, // CPU Passive Cooling Temperature ..... }

Code: \_TZ.RTMP

Code: Method (RTMP, 0, NotSerialized) { If (\_SB.PCI0.LPCB.EC0.ECAV ()) { Store (\_SB.PCI0.LPCB.EC0.ECPU, Local0) If (LLess (Local0, 0x80)) { Store (Local0, LTMP) } } Return (LTMP) }

GPU (Intel) Temperature

GPU (Nvidia) Temperature (only on laptops with Nvidia GPU)

Code: \_SB.PCI0.LPCB.EC0.TH1R