ACPI: что это и как устроено

Питание и ACPI #acpi #hardware #linux

ACPI: что это и как устроено

ACPI (Advanced Configuration and Power Interface) — спецификация, которая описывает, как операционная система договаривается с прошивкой платформы. Формулировка с сайта разработки: ACPI создаёт «общие интерфейсы, дающие операционной системе возможность управлять конфигурацией устройств материнской платы и питанием как отдельных устройств, так и системы целиком» (OSPM — OS-directed configuration and Power Management).

Грубо говоря, ACPI — это язык. Прошивка на нём рассказывает ОС, что за железо стоит на плате, как его включать и выключать, где батарея, где датчики температуры и что делать, когда закрывают крышку. Без ACPI Linux видел бы процессор, память и шины, но не знал бы, например, что нажатие кнопки питания — это событие, а не просто замыкание.

Что описывает ACPI

  • Устройства и их ресурсы — какие устройства есть, какие у них адреса, прерывания, GPIO.
  • Состояния питания — отдельные состояния устройств (D0–D3) и состояния всей системы (S0–S5, см. Сон и пробуждение).
  • Батарею и зарядку — ёмкость, статус, пороги, батарея.
  • Температуру и охлаждение — термозоны, вентиляторы, троттлинг, температура.
  • События — кнопка питания, крышка, горячие клавиши, док-станция.
  • Wakup-источники — что может разбудить систему.

Таблицы

Прошивка (UEFI/BIOS) готовит в памяти набор таблиц. Схема связей описана в документации ядра:

RSDP  →  XSDT  →  FADT  →  DSDT
                  └─────→  SSDT (их может быть несколько)
  • RSDP (Root System Description Pointer) — корневая точка входа, по ней ОС находит остальное.
  • XSDT (Extended System Description Table) — оглавление: ссылки на FADT и SSDT. Рядом может быть старый RSDT — для совместимости с ACPI 1.0.
  • FADT (Fixed ACPI Description Table) — описание «фиксированных» возможностей платформы; содержит указатель на DSDT.
  • DSDT и SSDT (Differentiated / Secondary System Description Table) — блоки определений на языке AML (ACPI Machine Language): методы, устройства, ресурсы.

Все блоки определений загружаются в единое пространство имён — ACPI namespace. Это иерархия объектов с именами из четырёх байт (заглавные латинские буквы, цифры и _). \ — корень, ^ — родитель. Внутри — привычные по логам имена: \_SB (системная шина), \_SB.PCI0, \_SB.LID0 (крышка), \_TZ (термозоны), \_GPE (события), методы _HID, _STA, _BCL (яркость), _PSL и так далее.

Где это посмотреть на своей машине

Таблицы, которые передала прошивка:

ls /sys/firmware/acpi/tables/

На ноутбуке автора (Dell Latitude 7400) получается так:

APIC  BGRT  DBG2  DMAR  DSDT  FACP  FACS  FIDT  FPDT
HPET  LPIT  MCFG  NHLT  SLIC  SSDT1 SSDT2 SSDT3 SSDT4 ...

Сами таблицы читает обычно только root, но список имён доступен всем.

Дерево устройств, которое ядро построило из namespace:

ls /sys/bus/acpi/devices/          # устройства ACPI
ls /sys/devices/LNXSYSTM:00/       # корень дерева
cat /sys/bus/acpi/devices/PNP0C0D:00/path   # путь в namespace, например \_SB_.LID0

Дамп и дизассемблирование — пакет acpica-tools:

sudo apt install acpica-tools
sudo acpidump -b            # сохранит бинарные таблицы в текущий каталог
iasl -d dsdt.dat            # дизассемблирует AML в читаемый текст

iasl — это компилятор/дизассемблер AML из проекта ACPICA. ACPICA — референсная реализация ACPI, и именно её код лежит в основе подсистемы ACPI в ядре Linux.

Кто этим пользуется в системе

  • Ядро Linux разбирает таблицы при загрузке и создаёт устройства, термозоны, батареи, кнопки.
  • systemd-logind обрабатывает кнопки и крышку, инициирует сон и выключение (см. Сон и пробуждение).
  • acpid — необязательный демон, который передаёт события ACPI в пользовательское пространство скриптам. Ему нужен, только если события обрабатывает не systemd, а собственные сценарии.
  • /proc/acpi — устаревший интерфейс; с Linux 2.6.24 данные перенесены в /sys, а события приходят через netlink (это отмечает ArchWiki).

ACPI и UEFI — не одно и то же

Их часто путают, потому что обе штуки делает прошивка.

  • UEFI — про загрузку: найти загрузчик, отдать ему управление.
  • ACPI — про работу уже загруженной системы: таблицы остаются в памяти, и ОС пользуется ими всё время.

Таблица SLIC в списке выше — пример «оемовской» таблицы: она не нужна Linux, её читают Windows-активаторы. Она может быть, может не быть — на работу Linux не влияет.

Когда ACPI мешает

Иногда прошивка отдаёт кривые таблицы, и оборудование работает не так: не гаснет экран, не работает яркость, зависает сон. Для диагностики есть параметры ядра:

  • acpi=off — полностью отключить ACPI. Крайняя мера: вместе с ним отключатся зарядка батареи и энергосбережение.
  • acpi_osi="Windows 2015" — притвориться другой ОС, чтобы прошивка включила другой набор методов.

Оба параметра — диагностические. Если помогло, правильное решение — обновить прошивку или искать конкретный драйвер, а не жить с отключённым ACPI.

Что дальше

Источники

Оценка статьи 0

Комментарии

Пока комментариев нет.