Поиск
Ожидается релиз
openSUSE 12.1
Другие блоги

Включаем ASPM в openSUSE. Часть 1

ВНИМАНИЕ!!! Следуйте советам, приведенным ниже, только в том случае, если вы четко понимаете, что вы делаете. Автор не несет ответственности за любые последствия, вызванные манипуляциями, о которых пойдет речь далее.

Итак, если у вас не процессор coreiX и советы по уменьшению энергопотребления ноутбука, описанные в предыдущей статье вам не подходят, а ноут по прежнему очень быстро расходует ресурсы батареи, самое время обратить внимание на ASPM.

Как я уже писал в предыдущей статье, проблема с ASPM в Линуксе была решена включением патча от Мэтью Гаррета в ядро linux начиная с версии 3.3.

Патч действует только в системах, в которых в сообщениях ядра появляется «ACPI FADT declares the system doesn’t support PCIe ASPM, so disable it».

В принципе, в большинстве случаев вполне достаточно обновиться до новой версии ядра и проблема исчерпана. Но, к сожалению, не всегда все гладко получается и в этом случае. Самый главный подводный камень кроется в реализации ACPI производителем ноутбука.

Справка из вики:

Интерфейс ACPI организуется путём размещения в определённой области оперативной памяти нескольких таблиц, содержащих описание аппаратных ресурсов и программных методов управления ими. Каждый тип таблицы имеет определённый формат, описанный в спецификации. Кроме того, таблицы, содержащие методы управления устройствами и обработчики событий ACPI, содержат код на языке AML (ACPI Machine Language) — машинно независимый набор инструкций, представленный в компактной форме. Операционная система, поддерживающая ACPI, содержит интерпретатор AML, который транслирует инструкции AML в инструкции центрального процессора, выполняя таким образом методы или обработчики событий.

Некоторые из этих таблиц полностью или частично хранят статические данные в том смысле, что от запуска к запуску системы, они не изменяются. Статические данные, как правило, создаются производителем материнской платы или BIOS и описываются на специальном языке ASL (ACPI Source Language), а затем компилируются в представление на AML.

Так вот, по каким-то совершенно непонятным причинам разработчики BIOS не считают нужным придерживаться стандартов в описании таблиц. В пору, конечно, в очередной раз заподозрить разработчиков в сговоре с пресловутым Мелкософтом. Впрочем, многие производители железа грешат составлением совместных бизнес планов с разработчиками софта. Судить, о том, насколько подобное бизнес планирование выгодно для обоих, не будем. Можем лишь предположить, что если звезды зажигаются… то есть такие договоренности происходят, значит это кому-то нужно. Впрочем, не стоит сбрасывать со счетов и банальную халатность.

Итак, прежде всего нас интересует таблица DSDT, которая содержит описание устройств материнской платы. Для того чтобы нам ее получить, нужно сначала обзавестись необходимым инструментарием. Для этого ставим пакет acpica. После чего выполняем команды:

# acpidump > myacpi.dat

# acpixtract -a myacpi.dat

В результате мы получим все таблицы в бинарном виде. Для того, чтобы получить исходник таблицы DSDT:

# iasl -d DSDT.dat

На выходе мы получаем файл DSDT.dsl, который можно просмотреть обычным текстовым редактором и в случае знания языка ASL, даже что-то понять :) Мы же пойдем методом научного тыка. Пробуем скомпилировать полученный исходник обратно в бинарный вид:

# iasl -sa DSDT.dsl

В результате мы получим файл DSDT.aml и кучу ошибок в консоли :) Например:

 

DSDT.dsl 3060: Name (_T_1, Zero)

Remark 5111 – Use of compiler reserved name ^ (_T_1)

DSDT.dsl 3061: Name (_T_0, Zero)

Remark 5111 – Use of compiler reserved name ^ (_T_0)

DSDT.dsl 4191: Method (WM00, 3, NotSerialized)

Warning 1088 – ^ Not all control paths return a value (WM00)


Собственно, указывается номер строки в исходнике и содержимое ошибки.

Первые 2 ошибки говорят о том, что используется имя, зарезервированное компилятором и устраняются довольно просто. Достаточно заменить _T_X на T_X. Третья ошибка, как вы понимаете, указывает на то, что в методе не всегда возвращается какое-либо значение. Идем к нужной строке и смотрим содержимое метода:

 

Method (WM00, 3, NotSerialized)

{

Store (“00″, MTNM)

If (LEqual (Arg1, 0×06))

{

WMIS (Arg1, Arg2)

Return (DI00)

}

}

Как видим, в случае не выполнения условия If метод действительно не вернет ничего. Допишем его так:

Method (WM00, 3, NotSerialized)

{

Store (“00″, MTNM)

If (LEqual (Arg1, 0×06))

{

WMIS (Arg1, Arg2)

Return (DI00)

}

Return (0×00)

}


И попробуем снова скомпилировать исходник. Ошибки, которые мы исправили, должны исчезнуть. И так нужно исправить все ошибки, пока компилятор не перестанет ругаться.

У меня в результате получилось:

 

Intel ACPI Component Architecture

ASL Optimizing Compiler version 20110316-64

Copyright (c) 2000 – 2011 Intel Corporation

ASL Input: DSDT.dsl – 10014 lines, 336764 bytes, 3609 keywords

AML Output: DSDT.aml – 36671 bytes, 862 named objects, 2747 executable opcodes

Compilation complete. 0 Errors, 0 Warnings, 0 Remarks, 17 Optimizations


Даже если вы не знаете языка ASL, можно обратиться в гугл, способы исправления основных ошибок в исходнике ASL, как правило, уже давно описаны на многих форумах.

После правки таблицы DSDT нам нужно каким-то образом указать ядру использовать именно его. Один и возможных способов — это включить ее в initrd. Для этого выполняем команды:

 

# cat DSDT.aml >> /boot/<Имя_нового_initrd>

# cat /boot/<Имя_существующего_initrd> >> /boot/<Имя_нового_initrd>


После этого правим секцию загрузчика, и указываем Начальный RAM-диск как /boot/<Имя_нового_initrd>, после чего перегружаемся, выбирая исправленную секцию при загрузке.

Теперь смотрим, как определилась наша таблица DSDT:

 

# dmesg | grep DSDT

[ 0.000000] DSDT ACPI table found in initrd – size: 36671

[ 0.000000] ACPI: DSDT @ 0x0000000096ff0000 Phys table override, replaced with:

[ 0.000000] ACPI: DSDT 0000000096e2f000 08F3F (v01 ACRSYS ACRPRDCT 00000000 INTL 20110316)

[ 1.832955] ACPI: EC: Look up EC in DSDT


Как мы видим, наша правленная таблица была успешно подхвачена из initrd.

Продолжение следует.

 

Чтобы в SuSE был прогресс, подпишись на RSS!

Чтоб не ставить SuSE криво, подпишись скорей на мыло:

Читайте также:

  1. Включаем ASPM в openSUSE. Часть 2
  2. Боремся с энергопрожорливостью ноутбука
  3. Как хамелеон с лэптопом дружбу водили
  4. Трехмерный взгляд на Linux или драйвер NVIDIA в openSUSE
  5. Optimus и openSUSE 12.2

Оставить комментарий

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

Счетчики и кнопки

Rambler's Top100 Dobrobot Top Каталог блогов В каталоге DMOZ