Xem bài viết đầy đủ tại đây
Tác giả đã thử giải quyết vấn đề bằng cách can thiệp vào phần cứng để thông gió được tốt hơn, cho quạt quay suốt... và cuối cùng kết luận rằng dùng phần mềm để kiểm soát tốc độ quay của quạt là tốt nhất.
Tuy nhiên, nhiều dòng laptop HP chỉ dùng một quạt giải nhiệt chung cho CPU và GPU. Sensor của CPU điểu khiển tốc độ quay của quạt trong khi sensor của GPU không có vai trò gì. Các phần mềm điều khiển tốc độ quạt thông dụng không có tác dụng gì trên các dòng máy này.
Mẹo ở đây là viết lại đoạn mã ACPI của BIOS, báo giả nhiệt độ của CPU cao hơn thực tế để quạt khởi động sớm hơn.
Tác giả nâng nhiệt độ CPU bằng cách cộng thêm 32oC. Trên thực tế giá trị này phù hợp, không làm quạt quay suốt mà vẫn kéo nhiệt độ GPU về khoảng 44oC
Chú thích cho đoạn mã trên:
DTS1: nhiệt độ CPU0
DTS2: nhiệt độ CPU1
DS01, DS02, DSA1, DSA2: các biến tạm
TADJ: nhiệt độ cộng thêm, ở đây là 20Hex = 32oC
Đoạn mã chỉnh sửa từ START đến END
Cách làm và phần mềm cần thiết xem trong link đầu bài.
Mức độ khó: trung bình
Tác giả đã thử giải quyết vấn đề bằng cách can thiệp vào phần cứng để thông gió được tốt hơn, cho quạt quay suốt... và cuối cùng kết luận rằng dùng phần mềm để kiểm soát tốc độ quay của quạt là tốt nhất.
Tuy nhiên, nhiều dòng laptop HP chỉ dùng một quạt giải nhiệt chung cho CPU và GPU. Sensor của CPU điểu khiển tốc độ quay của quạt trong khi sensor của GPU không có vai trò gì. Các phần mềm điều khiển tốc độ quạt thông dụng không có tác dụng gì trên các dòng máy này.
Mẹo ở đây là viết lại đoạn mã ACPI của BIOS, báo giả nhiệt độ của CPU cao hơn thực tế để quạt khởi động sớm hơn.
Mã:
//Code to report a false CPU temperature. Use this code at your own risk
Scope(\_TZ_)
{
Name(TPC_, 0x78) //120C Critical level
Name(TP85, 0x6e) //110C Critical level
Name(TPTM, 0x4b) //75C Passive level
Name(TPAS, 0x5c) //92C Warning level
Name(TA85, 0x50) //80C Warning level
Name(DS01, 0x0)
Name(DS02, 0x0)
Name(DSA1, 0x0)
Name(DSA2, 0x0)
Name(TADJ, 0x20) // 32C Temp Adjustment
ThermalZone(THR1)
{
Method(_TMP, 0x0, NotSerialized) // Current temp
{
//START <----------------------------------------------------
If(ECON) // Embedded Controller Active Cooling Enabled
{
//Adjust CPU0 to increase fan speed
Store(DTS1, DS01)
// If less than Critical level
If(LLess(DS01, TP85))
{
Store(Add(DS01,TADJ), DSA1)
If(LGreater(DSA1, TP85))
{
Store(TP85, DSA1) //Never adjust higher than TP85
}
}
Else
{
Store(DS01, DSA1)
}
Store(DSA1, \_SB_.PCI0.LPCB.EC0_.ECT1)
//---------------------------------
//Adjust CPU1 to increase fan speed
Store(DTS2, DS02)
// If less than Critical level
If(LLess(DS01, TP85))
{
Store(Add(DS02,TADJ), DSA2)
If(LGreater(DSA2, TP85))
{
Store(TP85, DSA2) //Never adjust higher than TP85
}
}
Else
{
Store(DS02, DSA2)
}
Store(DSA2, \_SB_.PCI0.LPCB.EC0_.ECT2)
//---------------------------------
//Use highest CPU temprature
Store("Current temp is: ", Debug)
//If CPU0 greater then CPU1
If(LGreater(DSA1, DSA2))
{
Store(DSA1, Debug)
Store(\_SB_.PCI0.LPCB.EC0_.ECT1, \_SB_.PCI0.LPCB.EC0_.RG5B)
Return(Add(0xaac, Multiply(DSA1, 0xa)))
}
Else
{
Store(DSA2, Debug)
Store(\_SB_.PCI0.LPCB.EC0_.ECT2, \_SB_.PCI0.LPCB.EC0_.RG5B)
Return(Add(0xaac, Multiply(DSA2, 0xa)))
}
}
Else // Passive Cooling Enabled
{
Return(Add(0xaac, Multiply(TPTM, 0xa)))
}
}
//END <--------------------------------------------------
Method(_CRT, 0x0, NotSerialized) // Critical level
{
If(LEqual(\_SB_.TJ85, 0x0))
{
Return(Add(0xaac, Multiply(TPC_, 0xa)))
}
Else
{
Return(Add(0xaac, Multiply(TP85, 0xa)))
}
}
Method(_PSL, 0x0, NotSerialized) //list of passive cooling device objects
{
If(MPEN)
{
Return(Package(0x2)
{
\_PR_.CPU0,
\_PR_.CPU1
})
}
Return(Package(0x1)
{
\_PR_.CPU0
})
}
Method(_PSV, 0x0, NotSerialized) // Warning level
{
If(LEqual(\_SB_.TJ85, 0x0))
{
Return(Add(0xaac, Multiply(TPAS, 0xa)))
}
Else
{
Return(Add(0xaac, Multiply(TA85, 0xa)))
}
}
Method(_TC1, 0x0, NotSerialized) // Passive cooling constant
{
Return(0x2)
}
Method(_TC2, 0x0, NotSerialized) // Passive cooling constant
{
Return(0x3)
}
Method(_TSP, 0x0, NotSerialized) // Passive cooling sample period
{
Return(0x32) // 5 sec
}
}
}
Chú thích cho đoạn mã trên:
DTS1: nhiệt độ CPU0
DTS2: nhiệt độ CPU1
DS01, DS02, DSA1, DSA2: các biến tạm
TADJ: nhiệt độ cộng thêm, ở đây là 20Hex = 32oC
Đoạn mã chỉnh sửa từ START đến END
Cách làm và phần mềm cần thiết xem trong link đầu bài.
Mức độ khó: trung bình