QUOTE (Slice @ Apr 15 2010, 03:23 PM)

Итак, традиционным dumpacpitbls я получаю кучу таблиц, но только одну SSDT, и в ней нет _PSS. Но я заблуждался, думая, что их совсем нет.
По реалке у меня 5 таблиц SSDT, только нужно уметь их вынимать.
Подробности в мировой части форума
http://www.projectosx.com/forum/index.php?...&#entry6437а эверест под виндой тоже не видит эти 5 таблиц?
QUOTE (osik @ Apr 15 2010, 03:27 PM)

а эверест под виндой тоже не видит эти 5 таблиц?
Говорят,что он несколько таблиц видит, только я в винде не был уже черт знает сколько.
Продолжаю вчитываться в документацию.
CODE
Method (_PPC, 0) { // Performance Present Capabilities method
{
If (\_SB.DOCK) { // All _PSS states available (650, 600, 500).
Return(0)
} If (\_SB.AC) { // States 1 and 2 available (600, 500).
Return(1)
} Else { // State 2 available (500)
Return(2)
}
} // End of _PPC method
Итак, метод определяет, какие состояния процессора допустимы, в зависимости от состояния энергопитания. Если ноутбук в Доке, то доступны турбо-режимы, если подключен к розетке (AC), то нормальные, если от батарейки - то энергосберегающие.
А вот живой пример с Делл 1525
CODE
Method (_PPC, 0, NotSerialized)
{
Store (SMI (0xAD, 0x00), Local0) // информация считывается с SMBUS(?)
Return (Local0)
}
Теперь метод _PCT.
По спецификации определяет регистры, по которым система АЦПИ сама будет управлять питанием процессора.
Обычно здесь пишут 0, т.е. поручают это дело операционной системе, а именно AppleIntelCPUPowerManagement.kext.
CODE
Method (_PCT, 0, NotSerialized)
{
Return (Package (0x02)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x00, // Bit Width
0x00, // Bit Offset
0x0000000000000000, // Address
,)
},
ResourceTemplate ()
{
Register (FFixedHW,
0x00, // Bit Width
0x00, // Bit Offset
0x0000000000000000, // Address
,)
}
})
}
Однако, я вижу варианты. Мой ноутбук Самсунг не имеет НРЕТ, а потому AppleIntelCPUPM невозможен. Зато АПЦИ
CODE
Method (_PCT, 0, NotSerialized)
{
If (LEqual (And (PDC0, 0x01), 0x01))
{
Return (Package (0x02)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x00, // Bit Width
0x00, // Bit Offset
0x0000000000000000, // Address
,)
},
ResourceTemplate ()
{
Register (FFixedHW,
0x00, // Bit Width
0x00, // Bit Offset
0x0000000000000000, // Address
,)
}
})
}
Else
{
Return (Package (0x02)
{
ResourceTemplate ()
{
Register (SystemIO,
0x10, // Bit Width
0x00, // Bit Offset
0x00000000000000B0, // Address
,)
},
ResourceTemplate ()
{
Register (SystemIO,
0x08, // Bit Width
0x00, // Bit Offset
0x00000000000000B1, // Address
,)
}
})
}
}
Этот регистр В0 (В1) определен в таблице FADT
CODE
[030h 0048 4] SMI Command Port : 000000B0
Ах, да, на Делл 1525 также сделано, только регистр В2 (В3)
Метод _PDC устаревший в пользу _OSC. Есть стандартный переходник с одного на другой, см в посте №3.
А вот метод _OSC посложнее, он то и заполняет поле PDC0 в зависимости от.
Жду подсказок.
PS: А вот в SSDT Самсунга меня ожидала маленькая неприятность
CODE
Scope (\_PR.CPU0)
{
Name (PDC0, 0x00)
Method (ZPDC, 1, NotSerialized)
{
CreateDWordField (Arg0, 0x08, CAP0)
Store (CAP0, PDC0)
}
Этот метод ZPDC не является стандартным для АЦПИ, и не используется в MacOSX, а также не используется ни в ДСДТ, ни в ССДТ-№. Скорее всего, он написан в расчете на ОЕМ драйвер от компании Самсунг, естественно для Винды.
Вывод: SSDT таблицы обязательно нужно переписывать. Рассчитывать на таблицы из БИОСа не стоит.
Теперь метод _CST
Общий формат (пример от cvad)
CODE
Name (CST, Package (0x04)
{
0x03, // Количество C-State packages: 3 (C1, C2 и C3 (или C4 если CPU поддерживает)).
Package (0x04) {ResourceTemplate () {Register (FFixedHW, 0x01, 0x02, 0x000, ,)}, 1, 0, 1000}, // C1-State
Package (0x04) {ResourceTemplate () {Register (SystemIO, 0x08, 0x00, 0x814, ,)}, 2, 1, 500}, // C2-State
Package (0x04) {ResourceTemplate () {Register (SystemIO, 0x08, 0x00, 0x815, ,)}, 3, 0x55, 250} // или C3-State
//Package (0x04) {ResourceTemplate () {Register (SystemIO, 0x08, 0x00, 0x816, ,)}, 3, 0x55, 250} // или C4-State
})
CODE
Package { Register, Type, Latency, Power}
Type - это номер С-стейта
Latency - время задержки в микросекундах на переход между С-стейтами. Откуда брать? Начальные значения из таблицы FACP
CODE
[060h 0096 2] C2 Latency : 0096
[062h 0098 2] C3 Latency : 00FA
Можете поуменьшать и половить глюки, с какого момента начнутся. Для С1 значение минимальное. Здесь вижу 0, в Делле - 1, также и на С2 вижу 1. Большие значения только на С3 и С4 (который тоже обозначается 3).
Адреса регистров.
cvad - 814, 815, 816. Цифра 800 из FACP ([038h 0056 4] PM1A Event Block Address)
Samsung - 8014, 8015, 8016.
Dell1525 - C2=1014, как у всех, а вот адрес для С3 отличается, в зависимости от конфигурации 1015, 1016 и даже 1018.
CODE
If (And (CFGD, 0x0200))
{
...........
Package (0x04)
{
ResourceTemplate ()
{
Register (SystemIO,
0x08, // Bit Width
0x00, // Bit Offset
0x0000000000001018, // Address
,)
},
0x03,
0xA2,
0x64
}
Еще прикол.
Удалил всю процессорную секцию из ДСДТ, а у меня спидстеп работает как и раньше, т.е. на родных SSDT таблицах из БИОСа. Это же ноутбук, да еще и от серьезной компании Делл. У меня, конечно, есть мечта поменять все эти таблицы, и добиться меньшего энергопотребления.
Универсальная процессорная секция от квада наверно это сделает, но там нет зависимостей от подключения к розетке, а я пока не разобрался, как это сделать.
Метод _OSC получает информацию от системы, и что-то ей возвращает. Что?
Я в соседней теме описывал, что еще надо править ACPI_SMC_PlatformPlugin под свою модель Мака.
Без этой правки тоже наблюдал застревание на нижней частоте.