Прищеплюємо powernow! Десктопних материнських плат

Вже майже чотири місяці минуло з моменту виявлення можливості переробки десктопних процесорів Athlon XP в мобільні. Практичну користь цього відкриття в першу чергу оцінили власники процесорів з заблокованим коефіцієнтом множення, оскільки в мобільних процесорах існує воозможность не просто міняти цей коефіцієнт, а робити це на льоту, прямо по ходу роботи операційної системи.

Відразу визначуся з терміном PowerNow! У контексті даної статті під цією технологією я буду розуміти здатність системи в автоматичному режимі змінювати напругу і коефіцієнт множення (далі просто КУ) процесора в залежності від завантаження процесора. Або хоча б тільки КУ.

Отже, розглянемо випадок, коли користувач вже замобіліл (/ мобілізував / мобілізував) свій процесор, а чіпсет його материнської плати підтримує зміну КУ.

Оскільки переважна більшість існуючих материнських плат під K7 не забезпечує підтримку PowerNow. то користувачеві доводиться вручну виставляти потрібний КУ. Доступні способи:
  1. Пропатчити биос Bios Patcher'ом від apple_rom'а з метою встановити бажаний коефіцієнт множення на етапі завантаження системи.
  2. Змінювати КУ при завантаженні ОС спеціальними утилітами (CPUMSR, CrystalCPU, а тепер ще й CBI).

Ці два способу не взаємовиключні, їх можна використовувати спільно.

Напевно користувач захоче встановити (і встановить) максимальний КУ для своєї системи. Надалі, КУ можна буде при необхідності вручну знизити тими ж утилітами. Це може бути корисно в разі, якщо очікується простий комп'ютера, коли завантаження процесора невелика. Знизиться частота процесора, відповідно зменшиться тепловиділення. І як наслідок, можна тим або іншим способом (про це в наступній статті) знизити частоту обертання вентиляторів і знизити шум системи охолодження. На жаль, якщо на час простою системою заплановані якісь дії (запуск антівірусника або програми обслуговування дисків), що різко підвищують завантаження процесора, то їм доведеться задовольнятися наявною обчислювальною потужністю.

У мобільних системах на платформі AMD (мобільний процесор + материнська плата з підтримкою мобільних процесорів) користувач звільнений від необхідності постійно стежити за частотою процесора. Тут цим параметром автоматично (залежно від завантаження CPU) щосили керує особливий драйвер. Для системи MS Windows XP SP1 це драйвер процесора. Для інших версій OC від MS - спеціальний PowerNow! драйвер (своєрідні «милиці», як я його про себе називаю) від самої AMD. Драйвер кілька десятків разів в секунду оцінює ступінь завантаження процесора і при необхідності коректує КУ процесора: при повному завантаженні частота максимальна, при нульовій - мінімальна.

Виникає закономірне питання: що ж заважає використовувати можливості згаданих драйверів для мобільних процесорів в десктопних комп'ютерах. Це питання я якраз і спробую висвітлити в цій статті.

Для того, щоб на комп'ютері можна було змусити працювати технологію PowerNow. необхідно щоб його компоненти відповідали наступним вимогам:

1. Процесор. Очевидно, що він повинен бути мобільним (оригінальним або переробкою з десктопного).

2. Материнська плата. Тут повинен виконуватися цілий комплекс умов:

2.1 чіпсет, на якому виготовлено материнська плата. Повинен підтримувати спеціальний цикл системної шини (FID / VID change), передбачений для зміни вольтажу або КУ. З усіх відомих чіпсетів для K7 на сьогоднішній день цій умові поки не задовольняють тільки чіпсети nForce / nForce2 від nVidia (точніше, немає достовірної інформації про те, що вони це вміють робити).

2.2 SoftVID. На материнській платі повинні бути розведені ніжки процесора, через які процесор інформує чіпсет про необхідному для його роботи напрузі.

2.3 BIOS. Повинен виявляти присутність мобільного процесора і відповідним чином налаштовувати такі компоненти:
2.3.1 чіпсет (через настройку відповідальних конфігураційних регістрів Host Bridge'а)

2.3.2 Процесор (змінити КУ і робоча напруга процесора на максимальні для прискорення подальшого завантаження ОС, але це не обов'язково)

2.3.3.1 Для т.зв. застарілих (legacy) операційних систем (w9x / w2k), що використовують драйвер від AMD, БІОС повинен створити в пам'яті блок даних PSB (Perfomance State Block), що містить в тому числі і інформацію щодо можливих станів процесора (т.зв. Perfomance States або PStates ). Кожне стан описується парою "КУ + відповідне йому напругу". Таких пар для кожного процесора може бути кілька (зазвичай 3-4). Теоретично БІОС повинен залишати в пам'яті лише PStates для встановленого в системі процесора. На практиці, як я зрозумів, багато біоси залишають в пам'яті подібні таблиці для всіх підтримуваних материнки процесорів.

2.3.3.2 Для операційних систем, в повній мірі підтримують ACPI (WinXP
SP1): створити або активувати в таблицях ACPI необхідні допоміжні об'єкти (_PCT, _PPC, _PSS і деякі інші). Згадані об'єкти створюються / змінюються БІОС для підтримки тільки встановленого в системі процесора.

3 Операційна система, точніше відповідний драйвер. Потрібна наявність мобільного процесора. Крім того:

3.1 якщо це драйвер від самої AMD, то він перевіряє наявність в пам'яті блоку PSB, і в подальшому управляє КУ і напругою на основі міститься там інформації. (Цей драйвер НЕ використовує ACPI з п.1.3.3.2)

3.2 якщо це драйвер від MS (в разі WinXP SP1), то він діє на основі інформації про об'єкти, що міститься в таблицях ACPI (в основному DSDT). Треба відзначити, що той же драйвер (amdk7.sys) встановлюється і для десктопних процесорів, але в цьому випадку частоту / вольтаж він, природно, не регулює. (Треба відразу згадати, що цей драйвер НЕ використовує PSB з п.1.3.3.1)

Легко помітити, що виконання умов 1, 2.1, 2.3.1 можна домогтися і для деськтопной материнської плати.
Пункт 2.2 виконати практично нереально - це зажадає перепайки плати: навіть якщо це можливо теоретично, ніхто при здоровому глузді за це не візьметься. Від цього пункту, як і від п.2.3.2, можна відмовитися.
Під питанням залишаються пункти 3 і 2.3.3. Очевидно, що вони безпосередньо пов'язані один з одним.

Частотою і напругою процесора в процесі роботи безпосередньо управляє тільки драйвер операційної системи. На БІОС ж (оскільки він уже йде з материнською платою, і краще знає, чи підтримує вона мобільні процесори і які саме) покладається завдання правильно розпізнати процесор і передати необхідні параметри роботи процесора відповідного драйверу операційної системи (п.2.3.3). Якщо драйвер не отримає такої інформації, то він не задіює функції PowerNow!
У цій взаємної залежності якраз і полягає проблема для спраглих PowerNow! для десктопів. Щоб її вирішити, необхідно:

Ось, власне, чому я зосередив свої зусилля на спробі модифікувати БІОС. З усіх Біосил на сьогоднішній день краще за всіх вивчені Біосил від фірми AWARD. Саме з авардовскімі Біосил я і почав експериментувати. На жаль, біоси від AMI, PHOENIX (рідні) та ін. Виробників залишилися в стороні через нестачу інформації по ним

Оскільки досліди з PSB вдалими назвати складно, то довелося перейти до спроб реалізувати запасний варіант з використанням ACPI. Відразу скажу, що в цьому напрямку дослідження виявилися більш результативними (в іншому випадку і статті б не з'явилося)

Однією з компонент, що складають технологію ACPI (Advanced Configuration Power Interface), є таблиці ACPI, головна з яких DSDT. На момент завантаження операційної системи вони розташовуються в пам'яті вище 1Mb. Таблиці можуть містити посилання на інші таблиці, а так же виконуваний AML (ACPI Machine Language) псевдокод, який містить опис об'єктів, і застосовних до них методів, тощо. Необхідну інформацію. AML код при необхідності можна аналізувати код в ASL (ACPI Source Language) для внесення змін. Цим я і скористався.

Відмінність таблиць DSDT для мобільного і деськтопной систем, полягає в тому, що мобільна має кілька додаткових об'єктів (_PCT, _PSS) і метод (_PPC), які як раз і дозволяють операційній системі задіяти технологію PowerNow!
(Є ще пара відмінностей в іншій таблиці FADT: об'єкти PSTATE_CNT і CST_CNT. Але я їх чіпати поки не буду)

Сподіваюся, все вже здогадалися, що потрібно зробити в даній ситуациии
Правильно! Додати в десктопну таблицю DSDT кілька нових об'єктів, або активувати їх, якщо вони там вже є. Інше питання: як це зробити. На щастя, для цього не потрібно додавати в біос новий код, який би обчислював розташування таблиць ACPI в пам'яті і модифікував їх. У випадку з БІОС від AWARD все йде набагато простіше: таблиці ACPI там містяться у вигляді окремого модуля ACPITBL.BIN, який можна витягти за допомогою CBROM, відредагувати, і назад запакувати за допомогою того ж CBROM.

З цього мометна, як мені здається, простіше і зрозуміліше рассмотриваются всі маніпуляції на конкретному прикладі. В якості піддослідного я взяв материнську плату EPoX 8KHA +, точніше, БІОС для неї (файл 8KHI3916.BIN).

Етап 1. Витяг таблиць ACPI з БІОС материнської плати:

Чесно зізнатися, я сильно сподіваюся, що ця утиліта у Вас вже є і Ви прекрасно знаєте, для чого вона існує. В іншому випадку я Вам вкрай не рекомендую втілювати в життя описані далі в цій статті дії по модифікації биоса. Відразу попереджаю, що за можливі збитки, який Ви собі заподієте після спроби реалізації на практиці описаних в цій статті дій Я ВІДПОВІДАЛЬНОСТІ НЕ несу. Дійте на свій страх і ризик!

Командний рядок для вилучення таблиць:

CBROM.exe 8KHI3916.BIN / ACPI extract

У відповідь на запит про ім'я файлу введіть: ACPITBL.BIN

Етап 2. Видалення старого ACPITBL.BIN з БІОС материнської плати:

Файл з таблицями ми витягли, тепер його можна видалити з файлу з БІОС.
Попередньо не забудьте зберегти на всякий пожежний оригінальний файл з БІОС.

Етап 3. Виділення таблиці DSDT з ACPITBL.BIN

Для проведення цього етапу можна скористатися написаної мною спеціально для цього випадку простенької утиліткою GetDSDT.exe

Етап 4. Дизасемблювання таблиці DSDT: AML -> ASL.

Отриману таблицю DSDT необхідно аналізувати код (хоча тут більше доречно поняття декомпілювати). Для проведення цієї операції буде потрібно интеловский утиліта IASL. Завантажити її можна з сайту Інтелу.

iasl.exe -d DSDT.hex

Етап 5. Конструювання об'єктів _PCT, _PSS, _PPC.

Розглянемо ці об'єкти по порядку.

_PCT (Perfomance Control) Цей об'єкт описує контрольний регістр і регістр стану. Має такий вигляд (опис взято з даташіта на K8, але підходить і для K7):

Цей об'єкт постійний, тобто не змінюється в залежності від процесора або будь-яких інших чинників.

_PCT (Perfomance Present Capabilities) Метод, який повертає номер мінімально допустимого (на момент виклику) стану PState. PState з найменшим номером (0) містить найбільший КУ, а з найбільшим номером - найменший КУ.
Цей метод застосовується тільки в разі, коли необхідно штучно обмежити частоту процесора. Наприклад, в ноутбуці, коли він працює від батарей. Для настільних систем цей метод повинен завжди повертати нуль (номер PState з максимальним КУ).

_PSS (Perfomance-Supported States) - найцікавіший об'єкт. Саме він задає той набір станів PStates (пари КУ + вольтаж), в яких може перебувати процесор. Очевидно, що цей об'єкт є індивідуальним для кожної моделі процесора.
Приклад такого об'єкта, що складається з двох PStates для замобіленного Duron1200 (Morgan):

УВАГА! Оскільки передбачається використання даного об'єкта на материнській платі, яка не підтримує SoftVID, то значення напруги тут встановлюється як NewVID = 00h (1.85 / 2.00 Вольта.)

У найближчому майбутньому постараюся більш детально описати, що означає кожна абревіатура, за що відповідає і які значення приймає (деякі відомості подані в ptchACPI.cfg)

Всі три об'єкти разом складають один, який називається \ _PR.CPU0 і розташовується відразу за об'єктом \ _PR. Для полегшення процесу конструювання довелося написати ще одну утилітки ptchACPI.exe. яка на основі інформації з файлу конфігурації ptchACPI.cfg конструює об'єкт \ _PR.CPU0 і записує його в файл CUSTOM.ASL.
Далі потрібно лише додати отриманий об'єкт в файл DSDT.dsl відразу після об'єкта \ _PR і результат записати в файл newDSDT.dsl.

Приклад: (потрібний фрагмент файлу DSDT.dsl до зміни)

А це потрібний фрагмент файлу DSDT.dsl (newDSDT.dsl) вже після внесення змін:

Етап 5. Ассемблирование таблиці DSDT: ASL -> AML

Для того, щоб з ASL коду отримати бінарник, знову скористаємося интеловской утилітою:

В результаті отримуємо нову таблицю DSDT в файлі DSDT.aml.

Етап 6. відтворити файл ACPITBL.BIN

тут:
OTHERS.hex - файл, який був створений на Етапі # 3
DSDT.aml - файл, отриманий на попередньому Етапі № 5

Етап 7. Запихаємо ACPITBL.BIN назад в файл БІОСа материнської плати

CBROM.exe 8KHI3916.BIN / ACPI ACPITBL.BIN

тут:
ACPITBL.BIN - файл, отриманий на попередньому Етапі # 6
8KHI3916.BIN - файл біоса, з якого на Етапі # 2 була видалена таблиця ACPI (ACPITBL.BIN)

Етап 8. прошивки БІОС
Сподіваюся, з цим етапом Ви впораєтеся і без моїх рекомендацій))

Етап 9. Завантаження WindowsXP SP1, тестування

Завантажуєте XP. У роздери панелі управління змініть тип енергозбереження з "настільного" на "портативний" / "економія батарей". Все повинно запрацювати.

Якщо немає, то спробуйте видалити драйвер процесора. Якщо ви встановлювали SP1 вручну, то вам просто необхідно виконати операцію з видалення старого драйвера. Після перезавантаження ОС встановить драйвер заново. Частота процесора повинна змінюватися в залежності від ступеня його завантаження.

Не забудьте прошити назад оригінальний біос при зміні процесора. Або хоча б змініть тип енергозбереження з "портативного" / "економії батарей" на "настільний" Інакше WinXP ви завантажити не зможете.

Величезні прохання до власників ноутбуків / дескноути на мобільних процесорах K7:

  1. Якщо ви користуєтеся драйверами від AMD для реалізації PowerNow. то повідомте будь ласка, версію драйвера (і посилання на його розташування в інеті), версію операційної системи і по можливості модель ноутбука.
  2. Вишліть мені ACPI таблиці, які використовуються в вашому ноутбуці. WindowsXP (і можливо в W2K) зберегти їх можна за допомогою команди: regedit / e "ACPItbl.reg" HKEY_LOCAL_MACHINE \ HARDWARE \ ACPI (тут "ACPItbl.reg" назва файлу, в який збережеться гілка реєстру, що містить образ ACPI таблиць)
  3. Якщо на вашому ноутбуці використовується биос від AWARD, збережіть, будь ласка, його образ за допомогою утиліти AWDFLASH і вишліть мені, або киньте посилання, звідки цей образ можна тягнути.

Оскільки, до мене в руки до сих пір ні разу не потрапляли ноутбуки на мобільних процесорах AMD, ваша інформація надасть неоціненну допомогу в моїх дослідженнях.

PS: обговорити статтю можна в форумі

BIOS and Kernel Developer's Guide for AMD Athlon 64 and AMD Opteron Processors rev.3.08 [26094] - вельми корисний документ, причому не тільки для K8, багато речей справедливі для K7 (ще раз спасибі serj_'у за наводку).