Multiply (Local0, 0x02, Local0): as I understood, the 0x02 here is the multiplier. Changing it changes the display FAN RPM. I can say that 02 is the wrong param for my laptop. The display RPM is way too high. I'm still experimenting with Windows to find out the most accurate multiplier.
Wrong. Have a look and your DSDT and you will know.
Let me explain the below code for you from my SSDT (Also, You can't use other machine's ssdt as the formula to convert 16bit value into RPM is different on different systems, unless they are same models, of course)
Code:
Method (FAN0, 0, Serialized)
{
Store (B1B2 (\_SB.PCI0.LPCB.EC0.TH00, \_SB.PCI0.LPCB.EC0.TH01), Local0)
If (LEqual (Local0, 0xFF))
{
Store (Zero, Local0)
}
If (Local0)
{
Multiply (Local0, 0x02, Local0)
Divide (0x0041CDB4, Local0, Local1, Local0)
}
Return (Local0)
}
I have created a method Fan0 as required by FakeSMC_ACPISensor.
As you have split 16 bit registers into 8 bits, Method B1B2 combines them together.
So, in the first line we are combining two 8 bits registers AH00 and AH01 and storing it's value into a variable called Local0.
In the line below it, we are using a conditional statement to check, If Local0's value is 255 (i.e. Fan is off) it stores Zero(0) in Local0 (i.e. RPM is zero)
Next, we are checking if Local0 has some value (i.e. not zero)
Then, we multiply the value of Local0 by 2 and then store it int Local0 (i.e. Local0's new value is Local0 x 2)
Then, we divide the value of Local0 by 0x0041CDB4 (4312500) and then store it's value in Local0.
Finally, we return the value of Local0 (i.e. 16bits converted to RPM units). The text above in bold is the formula your dsdt uses to convert bits to RPM.
Attaching a code snippet from your own DSDT for method TACH0:
Code:
Method (TACH, 1, Serialized)
{
Name (_T_0, Zero) // _T_x: Emitted by ASL Compiler
If (ECAV ())
{
While (One)
{
Store (Arg0, _T_0)
If (LEqual (_T_0, Zero))
{
Store (B1B2 (TH00, TH01), Local0)
Break
}
ElseIf (LEqual (_T_0, One))
{
Store (B1B2 (TH10, TH11), 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)
}
}
Furthermore, you can verify CPU Temp to Fan RPM ratio on Windows and Mac by using HWMonitor. For my 3 ASUS machines, it is same (more precise on macOS). And, my fan does turn off when temp is lower than 32˚C
Regards