ACPI Thermal Management
This page captures an investigation into ACPI thermal management support with active and passive cooling.
Status
Implemented thermal zones and properties required for active (FAN) and passive (CPUFreq) cooling in RD-N2 platform.
Investigated Linux kernel support and proposed a patch to fix issues with passive cooling
Example Thermal Zone implementation in RD-N2
//FAN0
Name(FNS0,0)
PowerResource(FN00, 0, 0)
{
Method(_STA, 0, Serialized)
{
Return(FNS0)
}
Method(_ON, 0, Serialized)
{
printf ("Debug: Fan 0 on")
Store(1,FNS0)
}
Method(_OFF, 0, Serialized)
{
printf ("Debug: Fan 0 off")
Store(0,FNS0)
}
}
Device(FAN0)
{
Name(_HID, EISAID("PNP0C0B"))
Name(_UID,0)
Name(_PR0, Package(1){FN00})
}
//FAN1
Name(FNS1,0)
PowerResource(FN01, 0, 0)
{
Method(_STA, 0, Serialized)
{
Return(FNS1)
}
Method(_ON, 0, Serialized)
{
printf ("Debug: Fan 1 on")
Store(1,FNS1)
}
Method(_OFF, 0, Serialized)
{
printf ("Debug: Fan 1 off")
Store(0,FNS1)
}
}
Device(FAN1)
{
Name(_HID, EISAID("PNP0C0B"))
Name(_UID,1)
Name(_PR0, Package(1){FN01})
}
//ThermalZone0
Name(TMP1,3000)
ThermalZone(TZ00){
Method(_CRT) { Return(3880) }//114.85
Name(_TZP, 300)
//
Method(_AC0) { Return (3350)}//51.85
Name(_AL0, Package(){FAN0})
//
Method(_PSV) { Return(3500) }//76.85
Method(_TC1) { Return (4) }
Method(_TC2) { Return (3) }
Method(_TSP) { Return (10) }
Method(_PSL, 0, Serialized){ Return( Package(){\_SB.CL00.CP00, \_SB.CL01.CP01, \_SB.CL02.CP02, \_SB.CL03.CP03, \_SB.CL04.CP04, \_SB.CL05.CP05, \_SB.CL06.CP06} )}
Method(_SCP, 1, Serialized)
{
If(LEqual(Arg0,0)){
printf ("Debug: Active cooling")
}ElseIf(LEqual(Arg0,1)){
printf ("Debug: Passive cooling")
}
}
Method(_TMP, 0, Serialized)
{
If(TMP1 < 3600){
Add(TMP1,20,TMP1)
}Else{
TMP1 = 3000
}
Return(TMP1)
}
}
//ThermalZone1
Name(TMP2,3000)
ThermalZone(TZ01){
Method(_CRT) { Return(3880) }//114.85
Name(_TZP, 300)
//
Method(_AC0) { Return (3350)}//51.85
Name(_AL0, Package(){FAN1})
//
Method(_PSV) { Return(3500) }//76.85
Method(_TC1) { Return (4) }
Method(_TC2) { Return (3) }
Method(_TSP) { Return (10) }
Method(_PSL, 0, Serialized){ Return( Package(){\_SB.CL07.CP07, \_SB.CL08.CP08} )}
Method(_SCP, 1, Serialized)
{
If(LEqual(Arg0,0)){
printf ("Debug: Active cooling")
}ElseIf(LEqual(Arg0,1)){
printf ("Debug: Passive cooling")
}
}
Method(_TMP, 0, Serialized)
{
If(TMP2 < 3600){
Add(TMP2,20,TMP2)
}Else{
TMP2 = 3000
}
Return(TMP2)
}
}
Required properties for passive cooling
ThermalZones need to be defined
_CRT, _HOT, _PSV, _TZP, _PSL needs to be defined
_TC1, _TC2, and _TSP needs to be defined
_PTC, _TSS and _TPC are not required
ACPI Thermal Management Demo with active and passive cooling
ACPI Thermal Management Implementation Demo