I used this .NET program to do a binary dump of the Windows Registry at HKLM/Hardware/ACPI/DSDT
.
Then, running Microsoft's ASL Compiler on that, I can get this ACPI Source Language:
Scope(\_TZ_)
{
Name(TBSE, 0xaac)
Name(CRT0, 0x0)
Name(PSV0, 0x0)
ThermalZone(TZS0)
{
Method(_TMP, 0x0, NotSerialized)
{
If(\ECON)
{
Store(\_SB_.PCI0.LPC0.EC0_.THS0, Local0)
Store(\_SB_.PCI0.LPC0.EC0_.KCSS, Local1)
Store(\_SB_.PCI0.LPC0.EC0_.KOSD, Local2)
}
Else
{
Store(RBEC(0x92), Local0)
And(Local0, 0x1, Local1)
And(Local0, 0x8, Local2)
Store(RBEC(0xa8), Local0)
}
If(Local1)
{
Add(PSV0, 0x1, Local0)
}
If(Local2)
{
If(LNot(LGreater(Local0, CRT0)))
{
Add(CRT0, 0x2, Local0)
}
}
Return(C2K_(Local0))
}
Method(_HOT, 0x0, NotSerialized)
{
If(LEqual(OSYS, 0x7d6))
{
If(\ECON)
{
Store(0x20, \_SB_.PCI0.LPC0.EC0_.TIID)
Store(\_SB_.PCI0.LPC0.EC0_.TSC0, Local0)
}
Else
{
WBEC(0x1, 0x20)
Store(RBEC(0xd1), Local0)
}
If(LOr(LNot(LLess(Local0, 0x80)), LLess(Local0, 0x1e)))
{
Store(0x78, Local0)
}
Store(Local0, CRT0)
Return(C2开发者_StackOverflow中文版K_(Local0))
}
Else
{
Return(C2K_(0x78))
}
}
Method(_CRT, 0x0, NotSerialized)
{
If(LNot(LEqual(OSYS, 0x7d6)))
{
If(\ECON)
{
Store(0x20, \_SB_.PCI0.LPC0.EC0_.TIID)
Store(\_SB_.PCI0.LPC0.EC0_.TSC0, Local0)
}
Else
{
WBEC(0x1, 0x20)
Store(RBEC(0xd1), Local0)
}
If(LOr(LNot(LLess(Local0, 0x80)), LLess(Local0, 0x1e)))
{
Store(0x78, Local0)
}
Store(Local0, CRT0)
Return(C2K_(Local0))
}
Else
{
Return(C2K_(0x78))
}
}
Name(_PSL, Package(0x1)
{
\_PR_.CPU0
})
Method(_PSV, 0x0, NotSerialized)
{
If(\ECON)
{
Store(0x20, \_SB_.PCI0.LPC0.EC0_.TIID)
Store(\_SB_.PCI0.LPC0.EC0_.TSP0, Local0)
}
Else
{
WBEC(0x1, 0x20)
Store(RBEC(0xd0), Local0)
}
If(LOr(LNot(LLess(Local0, 0x80)), LLess(Local0, 0x1e)))
{
Store(0x5a, Local0)
}
Store(Local0, PSV0)
Return(C2K_(Local0))
}
Name(_TC1, 0x4)
Name(_TC2, 0x3)
Name(_TSP, 0x96)
Method(FMAX, 0x0, NotSerialized)
{
If(\ECON)
{
Store(0x40, \_SB_.PCI0.LPC0.EC0_.TIID)
Store(\_SB_.PCI0.LPC0.EC0_.TSP3, Local0)
}
Else
{
WBEC(0x1, 0x40)
Store(RBEC(0xd6), Local0)
}
Return(FSTL(Local0))
}
Method(FMIN, 0x0, NotSerialized)
{
If(\ECON)
{
Store(0x40, \_SB_.PCI0.LPC0.EC0_.TIID)
Store(\_SB_.PCI0.LPC0.EC0_.TSP0, Local0)
}
Else
{
WBEC(0x1, 0x40)
Store(RBEC(0xd0), Local0)
}
Return(FSTL(Local0))
}
Method(FRSP, 0x0, NotSerialized)
{
If(\ECON)
{
Store(\_SB_.PCI0.LPC0.EC0_.FSR1, Local0)
}
Else
{
Store(RBEC(0x95), Local0)
}
Return(FSTL(Local0))
}
Method(FSSP, 0x1, NotSerialized)
{
If(LEqual(Arg0, 0x0))
{
If(\ECON)
{
Store(0x1, \_SB_.PCI0.LPC0.EC0_.FSHC)
Sleep(0x64)
Store(0xff, \_SB_.PCI0.LPC0.EC0_.FSW1)
}
Else
{
Store(RBEC(0x93), Local0)
Or(Local0, 0x10, Local0)
WBEC(0x93, Local0)
Sleep(0x64)
WBEC(0x94, 0xff)
}
}
Else
{
If(\ECON)
{
Store(0x0, \_SB_.PCI0.LPC0.EC0_.FSHC)
}
Else
{
WBEC(0x93, 0x0)
}
}
}
Method(FSTL, 0x1, NotSerialized)
{
If(LOr(LEqual(Arg0, 0x0), LEqual(Arg0, 0xff)))
{
Store(Zero, Local1)
}
Else
{
Divide(0x78000, Arg0, Local0, Local1)
}
Return(Local1)
}
}
....
I only understand bits and pieces. The TZ refers to a scope dedicated to thermal zones (I think).
From reading the ACPI Spec, I see that _HOT and _CRT are OSPM objects relating to temperature thresholds.
The _HOT object declares the critical temperature at which OSPM may choose to transition the system into the S4 sleeping state, if supported; The _CRT object declares the critical temperature at which OSPM must perform a critical shutdown.
So I'm figuring that snip of the DSDT has something to do with manipulating the laptop fan speed depending on the sensed temperature in thermal zone 0. Based on that I'm guessing that FSTL
in the above is Fan-Set-Level or something similar, and FMAX
and FMIN
are Fan-Max-Speed and -Min-Speed, respectively. I think C2K
is a convert-to-Kelvin function. Beyond that I am just guessing based on guesses.
Edit: upon further review, _PSL
is Passive List (according to the ACPI Spec), which returns a list of Passive Temperature control devices. Where Fans are considered "Active" temperature control, an example of "Passive" temp control would be turning the voltage or speed down on a CPU. So I'm not sure this section controls the fan at all. It could be dedicated solely to passive temp control.
What I'm trying to do is modify the laptop fan speed that gets used for various temperatures. In some DSDT, the mapping between temp and fan speed is in a neat little table, and modifying the mapping is just a matter of changing a few numbers. It does not appear that there's a table like that in this ASL file, so I think there must be some program logic doing the mapping.
Can anyone help decipher it for me?
What I really am trying to do is get the fan to relax on an HP G60-244dx laptop. It runs too loud even when the CPU is idle, and ... if it is like my previous HP nc8430 laptop, the fan speed is set unnecessarily high. It's possible to lower the fan speed, yet keep the CPU temperature the same.
I think in order to modify the fan speed I need to patch the DSDT, and that's why I want to decipher the above.
Many thanks.
possibly related:
Setting an ACPI field in LinuxCame across this while attempting the same process on my HP dm1-3100ev. There's no direct fan speed setting, it must be calculated in code. The closest find is something like FMIN and FMAX settings, set to 20 and 56, respectively (don't these look like temperature limits for min and max fan speeds?) Changing those didn't work, though (maybe HP Coolsense is overriding things).
I'll let you know if I manage to find anything!
Edit: I was wrong, FMIN and FMAX specify the min and max fan speeds: 2000 and 5600, respectively. Unfortunately, changing those still doesn't work.
精彩评论