ACPI, DSDT

Если у вас нет проблем с ACPI т.е. все кнопочки работают и никаких ошибок связанных с ACPI в логах не появляется. Что ж во первых я вас поздравляю закрывайте эту страницу и идите пить к примеру кофе/чай. Во вторых даже отсутствие ошибок в логах и абсолютно полностью работающая система не признак отсутствия ошибок в DSDT так что дальше смотрите сами. В любом случае проверка займет всего пару минут. И как поступить решать не мне.

Собственно у меня с моим ноутбуком AS5730ZG-323G25Mi изначально никаких проблем не было. Но дальше, как это часто бывает, расследую причины одной ошибки решил проверить DSDT.

Для тех кто захочет подковаться в теории: HOWTO: Fix Common ACPI Problems (DSDT, ECDT, etc.) и ACPI/Fix common problems

Далее переходим к практике… Для начала нужен главный инструмент

emerge sys-power/iasl

Далее нужна сама таблица DSDT. Для новых ядер

cat /sys/firmware/acpi/tables/DSDT > dsdt.dat

Для тех кто в криокамере

cat /proc/acpi/dsdt > dsdt.dat

Ну а теперь все просто как пять копеек

iasl -d dsdt.dat # Дизассемблируем DSDT
iasl -tc dsdt.dsl # Перекомпилируем DSDT

Если после последней операции вы увидили

iasl -tc dsdt.dsl
(cut)
Compilation complete. 0 Errors, 0 Warnings, 0 Remarks, {ЧИСЛО} Optimizations

Я вас поздравляю закрывайте эту страницу и идите пить чай/кофе.

Вот например что увидел я

> iasl -tc acer-aspire-5730zg-bios.v-1.23-orig.dsl

Intel ACPI Component Architecture
ASL Optimizing Compiler version 20091013 [Dec 10 2009]
Copyright (C) 2000 - 2009 Intel Corporation
Supports ACPI Specification Revision 4.0

acer-aspire-5730zg-bios.v-1.23-orig.dsl  4922:                     Method (HKDS, 1, NotSerialized)
Warning  1087 -                          Not all control paths return a value ^  (HKDS)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  5742:                         Name (_HID, "*pnp0c14")
Error    4001 -                                        String must be entirely alphanumeric ^  (*pnp0c14)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  5801:                         Method (_WED, 1, NotSerialized)
Warning  1087 -                              Not all control paths return a value ^  (_WED)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  5801:                         Method (_WED, 1, NotSerialized)
Warning  1080 -                               Reserved method must return a value ^  (_WED)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  6182:                         Method (WMC9, 3, NotSerialized)
Warning  1087 -                              Not all control paths return a value ^  (WMC9)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  6445:                         Method (WRCB, 2, NotSerialized)
Warning  1087 -                              Not all control paths return a value ^  (WRCB)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  6633:                         Method (WMCD, 3, NotSerialized)
Warning  1087 -                              Not all control paths return a value ^  (WMCD)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  7277:                         Method (WMCF, 3, NotSerialized)
Warning  1087 -                              Not all control paths return a value ^  (WMCF)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  7407:                                     Name (_T_0, 0x00)
Remark   5110 -                                               Use of compiler reserved name ^  (_T_0)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  7444:                                         Name (_T_1, 0x00)
Remark   5110 -                                                   Use of compiler reserved name ^  (_T_1)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  7460:                                             Name (_T_2, 0x00)
Remark   5110 -                                                       Use of compiler reserved name ^  (_T_2)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  7518:                                                 Name (_T_3, 0x00)
Remark   5110 -                                                           Use of compiler reserved name ^  (_T_3)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  7562:                                                     Name (_T_4, 0x00)
Remark   5110 -                                                               Use of compiler reserved name ^  (_T_4)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  7604:                                                     Name (_T_5, 0x00)
Remark   5110 -                                                               Use of compiler reserved name ^  (_T_5)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  7684:                         Method (WB15, 6, NotSerialized)
Warning  1087 -                              Not all control paths return a value ^  (WB15)

acer-aspire-5730zg-bios.v-1.23-orig.dsl  7740:                         Name (_HID, "*pnp0c14")
Error    4001 -                                        String must be entirely alphanumeric ^  (*pnp0c14)

ASL Input:  acer-aspire-5730zg-bios.v-1.23-orig.dsl - 10390 lines, 400823 bytes, 4157 keywords
Compilation complete. 2 Errors, 8 Warnings, 6 Remarks, 1110 Optimizations

Не радостно… Сразу следует сказать вот какой момент пишут, что DSDT зависит еще и от версии биоса. Т.е. при обновлении биоса все якобы нужно начинать с начала. Поэтому я сохранял DSDT в acer-aspire-5730zg-bios.v-1.21-orig.dsl, acer-aspire-5730zg-bios.v-1.23-custom.dsl соответственно. Однако в моем случае производитель не внес никаких изменений. Далее я сохранял acer-aspire-5730zg-bios.v-1.23-custom.dsl уже как acer-aspire-5730zg-bios.v-1.23-custom.dsl и все изменения производил уже над ним.

Дальше я пойду по порядку возникновения ошибок.

4922: Method (HKDS, 1, NotSerialized)
Warning 1087  Not all control paths return a value ^ (HKDS)

На строчке 4922 видим

                Method (HKDS, 1, NotSerialized) # строка 4922
                {
(cut)
                    If (LEqual (0x01, DSEN)) {}
                } # строка 5067

                Method (_Q19, 0, NotSerialized) # строка 5069 начало нового метода

Так вот собственно решение первой проблемы

                Method (HKDS, 1, NotSerialized) # строка 4922
                {
(cut)
                    If (LEqual (0x01, DSEN)) {}
                    Return (0x00) # вставили
                } # строка 5068

                Method (_Q19, 0, NotSerialized) # строка 5070 начало нового метода

Далее

5743: Name (_HID, «*pnp0c14)
Error 4001  String must be entirely alphanumeric ^ (*pnp0c14)


:::BashLexer
Name (_HID, "*pnp0c14") # строка 5743

Собственно решение

Name (_HID, "pnp0c14") # строка 5743

Для всех вот этих ошибок

5802: Method (_WED, 1, NotSerialized)
Warning 1087  Not all control paths return a value ^ (_WED)

5802: Method (_WED, 1, NotSerialized)
Warning 1080  Reserved method must return a value ^ (_WED)

6183: Method (WMC9, 3, NotSerialized)
Warning 1087  Not all control paths return a value ^ (WMC9)

6446: Method (WRCB, 2, NotSerialized)
Warning 1087  Not all control paths return a value ^ (WRCB)

6634: Method (WMCD, 3, NotSerialized)
Warning 1087  Not all control paths return a value ^ (WMCD)

7278: Method (WMCF, 3, NotSerialized)
Warning 1087  Not all control paths return a value ^ (WMCF)

Решение будет аналогично первому т.е. до скобки закрытия каждого из описанных методов надо поставить Return (0x00)

Вот эта вереница загадок

7408: Name (_T_0, 0x00)
Remark 5110  Use of compiler reserved name ^ (_T_0)

7445: Name (_T_1, 0x00)
Remark 5110  Use of compiler reserved name ^ (_T_1)

7461: Name (_T_2, 0x00)
Remark 5110  Use of compiler reserved name ^ (_T_2)

7519: Name (_T_3, 0x00)
Remark 5110  Use of compiler reserved name ^ (_T_3)

7563: Name (_T_4, 0x00)
Remark 5110  Use of compiler reserved name ^ (_T_4)

7605: Name (_T_5, 0x00)
Remark 5110  Use of compiler reserved name ^ (_T_5)

распутывается вообще банально. Компилятор пытается нам сказать, что вместо _T_0, _T_1, _T_2, _T_3, _T_4, _T_5 использовать T_0, T_1, T_2, T_3, T_4, T_5.

Далее

7685: Method (WB15, 6, NotSerialized)
Warning 1087  Not all control paths return a value ^ (WB15)

Это мы уже проходили… Опять же вставить Return (0x00)

И наконец то

7741: Name (_HID, «*pnp0c14)
Error 4001  String must be entirely alphanumeric ^ (*pnp0c14)

И это уже было… убираем звёздочку.

И вот он финальный аккорд

> iasl -tc acer-aspire-5730zg-bios.v-1.23-custom.dsl

Intel ACPI Component Architecture
ASL Optimizing Compiler version 20091013 [Dec 10 2009]
Copyright (C) 2000 - 2009 Intel Corporation
Supports ACPI Specification Revision 4.0

ASL Input:  acer-aspire-5730zg-bios.v-1.23-custom.dsl - 10397 lines, 398866 bytes, 4164 keywords
AML Output: dsdt.aml - 41022 bytes, 897 named objects, 3267 executable opcodes

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

Ну вот собственно и что из этого? Это не конец… это только начало.

cp /path/to/acer-aspire-5730zg-bios.v-1.23-custom.hex
/usr/src/dsdt_table.h

Как советует руководство

First in kernel config, disable “Select only drivers that don’t need
compile-time external firmware”

Т.е. Выключаем “Select only drivers that don’t need compile-time external firmware”

Device Drivers —>
Generic Driver Options —>
[ ] Select only drivers that don’t need compile-time external
firmware
[ ] Prevent firmware from being built

Then enable the custom DSDT options in the kernel, and provide a path
to the hex dsdt table that you compiled.

Включаем измененную DSDT

Power management options (ACPI, APM) —>
ACPI (Advanced Configuration and Power Interface) Support —>
[*] Include Custom DSDT
(/usr/src/dsdt_table.h) Custom DSDT Table file to include

Ну и дальше

Recompile your kernel, copy the bzImage, and modify your grub.conf to
point to the new kernel.

В руководствах, кроме компилирования ядра с DSDT, рассмотрены несколько путей решения и как поступать определять вам.

Если что:

acer-aspire-5730zg-bios.v-1.21-orig.dsl.gz

acer-aspire-5730zg-bios.v-1.23-orig.dsl.gz

acer-aspire-5730zg-bios.v-1.23-custom.dsl.gz

Только поменяйте gz1.odt на gz

Comments