Обустраиваем 'Термальную зону' (_TZ)

для раздела Блоги
[v.001 от 12-10-2004]

Полгода назад планировал написать по этой теме статейку. Но с тех пор мой интерес к ACPI сильно поугас, так толком и не разгоревшись. Так что пока все не забыл окончательно, накропаю для себя небольшую заметку-памятку. Может кого-то после ее прочтения данная тема заинтересует больше, чем меня

Что такое "термальная зона" ? Упрощенно говоря, это такая структура в ACPI, позволяющая операционной системе регулировать тепловые характеристики системы и/или ее компонентов. Операционка через ACPI-драйвер получает информацию о температуре отдельных компонентов, и на ее основе решает, как и с помощью каких средств охлаждать эти самые компоненты. Все очень похоже на функционирование SpeedFan в режиме "Automatic Fan Speed", только никакого доп. софта для управления вентиляторами не требуется -- нужна лишь операционная система с поддержкой ACPI.

В WinXP термальная зона обычно присутствует в виде устройства в списке оборудования.

Рисунок 1: Так выглядит "термальная зона" (_TZ) в 'Диспетчере устройств' WindowsXP.


Честно признаюсь, мне лениво расписывать все подробности относительно ТЗ -- их вы всегда их можете найти в спецификации на ACPI Приведу лишь небольшой пример реализации термальной зоны для материнской платы EPoX 8RDA (AWARD BIOS). К сожалению на этой материнке не распаяна обвязка для управления оборотами вентилятора, но если бы все-таки она (обвязка) присутствовала, то все бы сносно работало -- ответственные за обороты регистры микросхемы мониторинга изменялись в зависимости от температуры процессора (ОС Win98SE, под XP не пробовал)

Кусок ASL кода, относящийся к термальной зоне, до изменения.

    Scope (\_TZ)

{
Device (FAN)
{
Name (_HID, EisaId ("PNP0C0B"))
Method (_INI, 0, NotSerialized)
{
Store (TP1H, CTOS)
Store (TP1L, CTHY)
}
}

ThermalZone (THRM)
{
Name (_AL0, Package (0x01)
{
FAN
})
Method (_AC0, 0, NotSerialized)
{
If (Or (PLCY, PLCY, Local7))
{
Return (TP2H)
}
Else
{
Return (TP1H)
}
}

Name (_PSL, Package (0x01)
{
\_PR.CPU0
})
Name (_TSP, 0x3C)
Name (_TC1, 0x04)
Name (_TC2, 0x03)
Method (_PSV, 0, NotSerialized)
{
If (Or (PLCY, PLCY, Local7))
{
Return (TP1H)
}
Else
{
Return (TP2H)
}
}

Method (_CRT, 0, NotSerialized)
{
Return (TRPC)
}

Method (_TMP, 0, NotSerialized)
{
And (SENF, 0x01, Local6)
If (LEqual (Local6, 0x01))
{
Return (RTMP ())
}
Else
{
Return (0x0B86)
}
}

Method (_SCP, 1, NotSerialized)
{
If (Arg0)
{
Store (One, PLCY)
}
Else
{
Store (Zero, PLCY)
}

Notify (\_TZ.THRM, 0x81)
}

Method (STMP, 2, NotSerialized)
{
Store (Arg1, DW00)
If (Arg0)
{
STHY (DB00, DB01, DW00)
}
Else
{
STOS (DB00, DB01, DW00)
}
}
}
}

.

Тот же кусок на 1 термальную зону после внесения изменений (некоторые вещи пришлось очень сильно упростить):

    Scope(\_TZ)

{
//============================================================================
//===== Power Resources======
//
// Winbond W83627HF:
// PWMOUT1 Control -- Index 5Ah (Bank 0)
// PWMOUT2 Control -- Index 5Bh (Bank 0)

PowerResource(FN00,0,1){
Method (_STA) {Return(Lequal(GBYT(0x5B),0xFF))}
Method (_ON) {SBYT(0x5B,0xFF)}
Method (_OFF) {SBYT(0x5B,0x3F)}
}

PowerResource(FN01,0,1){
Method (_STA) {Return(Lequal(GBYT(0x5B),0x3F))}
Method (_ON) {SBYT(0x5B,0x3F)}
Method (_OFF) {SBYT(0x5B,0x0F)}
}

PowerResource(FN02,0,1){
Method (_STA) {Return(Lequal(GBYT(0x5B),0x0F))}
Method (_ON) {SBYT(0x5B,0x0F)}
Method (_OFF) {SBYT(0x5B,Zero)}
}
//==========================================================================================
//===== Devices
Device (FN0H){
Name(_HID,EISAID("PNP0C0B"))
Name(_PR0,Package() {FN00})
}

Device (FN0M){
Name(_HID,EISAID("PNP0C0B"))
Name(_PR0,Package() {FN01})
}

Device (FN0L){
Name(_HID,EISAID("PNP0C0B"))
Name(_PR0,Package() {FN02})
}

//=================================================================================
ThermalZone (THRM)
{
Name (_AL0,Package(0x01) {FN0H})
Name (_AL1,Package(0x01) {FN0M})
Name (_AL2,Package(0x01) {FN0L})

Method(_AC0,0,NotSerialized){
Store (50, Local0) //
Multiply(Local0, 0x0A , Local0)
Add (Local0, 0x0AAC, Local0)
Return (Local0)
}

Method(_AC1,0,NotSerialized){
Store (45, Local0)
Multiply(Local0, 0x0A , Local0)
Add (Local0, 0x0AAC, Local0)
Return (Local0)
}

Method(_AC2,0,NotSerialized){
Store (40, Local0)
Multiply(Local0, 0x0A , Local0)
Add (Local0, 0x0AAC, Local0)
Return (Local0)
}

Method (_CRT,0, NotSerialized)
{
Store (75, Local0)
Multiply(Local0, 0x0A , Local0)
Add (Local0, 0x0AAC, Local0)
Return (Local0)
}

Method (_TMP, 0, NotSerialized)
{
Return (RTMP ())
}

Method (_PSV, 0, NotSerialized)
{
Store (70, Local0)
Multiply(Local0, 0x0A , Local0)
Add (Local0, 0x0AAC, Local0)
Return (Local0)
}

Name(_PSL,Package(0x01){\_PR.CPU0})

Name (_TSP, 0x3C)
Name (_TC1, 0x04)
Name (_TC2, 0x03)

Method (_SCP, 1, NotSerialized)
{
Store (Zero, PLCY) // 0 = Active, 1 = Passive
Notify (\_TZ.THRM, 0x81)
}

Method (STMP, 2, NotSerialized)
{
Store (Arg1, DW00)
If (Arg0)
{
STHY (DB00, DB01, DW00)
}
Else
{
STOS (DB00, DB01, DW00)
}
}
}
}
//============================================================================
.

Термальную зону можно использовать для организации Cool'n'Quiet!, точнее, только 'Quiet Как организовать Cool' средствами ACPI и операционной системы я уже рассматривал в одной из своих статей.

Главное преимущество использования термальной зоны -- не требуется дополнительного софта Регулировкой оборотов вентилятора в зависимости от температуры компонентов занимается сама ACPI-совместимая операционная система. Некоторые микросхемы мониторинга (точнее SuperIO), использумеые в материнских платах, настолько редки, что популярные программы мониторинга даже не знают о них, и следственно не могут регулировать обороты вентиляторов. В этом случае термальная зона вне конкуренции -- она писалась под эту плату и знает как с ней работать Такая ситуация часто встречается в ноутбукостроении

Кстати, в связи с этим всплывает еще один интересный аспект использования термальной зоны -- для реверса Если нет даташита на используемую в ноутбуке микросхему мониторинга, то всегда можно подсмотреть интересующие моменты в ASL-коде термальной зоны, и не только. Например: регистры управления оборотами вениляторов, регистры, содержащие значения температур, и пр..

Но не все так идеально. Если рассматривать надежность термальной зоны, то она не хуже, чем у других программных решений (SpeedFan, MBM), но все таки ниже, чем у аппаратных систем терморегулирования (технологии Winbond SmartFAN, ITE SmartGuardian).

Ну вот пожалуй и все умные и не очень мысли на сегодня. Если еще что существенное вспомню, добавлю потом.


Вадим Карпов


Линки по теме:

Небольшой обзор технологии Winbond SmartFAN

Некоторые мысли и замечания относительно технологии Cool'n'Quiet (и PowerNow!)

---
Обсудить эту и другие статьи/записи с моей персональной страницы можно в соответствующей ветке конференции
Telegram-канал @overclockers_news - это удобный способ следить за новыми материалами на сайте. С картинками, расширенными описаниями и без рекламы.

Возможно вас заинтересует

Популярные новости

Сейчас обсуждают