Geschafft: Fast alle Notebooks, Komplett-PCs, Komponenten und Betriebssysteme schmücken sich mit dem Kürzel ACPI. Seit der erste Version des Advanced Configuration and Power Interface im Jahr 1996 ist es das erklärte Ziel der Spezifikation, den APM-Standard (Advanced Power Management) und das unflexible Plug&Play-Bios endlich in Rente zu schicken.
ACPI wird oft als reiner Ersatz für APM angesehen. Falsch: Das C für Configuration ist ein integraler Bestandteil von ACPI, der eine einheitliche und soweit möglich betriebssystemunabhängige Schnittstelle für das Hardwaresetup liefert. So verwendet Linux 2.6 ACPI für das Routing der PCI-Interrupts. Will man hierfür auf einem Ein-Prozessor-System den Advanced Programmable Interrupt Controller (APIC) statt des betagten PIC einsetzten - um Ressourcenkonflikte oder die Mehrfachbelegung von Interrupts zu vermeiden - führt kein Weg an ACPI vorbei. Außerdem erfährt der Kernel über das ACPI-Subsystem, welche PCI-Devices Hotplug-fähig sind und wie diese zu konfigurieren sind. Die Routinen liegen in »drivers/pci/hotplug/ acpiphp_glue.c«.
ACPI dagegen abstrahiert die Hardware-abhängigen Funktionen durch die ACPI Source Language (ASL) und deren Kompilat, die ACPI Machine Language. AML beschreibt die Hardware und die Schritte, um auf sie zuzugreifen. Jedes ACPI-kompatible Betriebssystem besitzt einen AML-Interpreter für AML-Byte-Code.
Zwei-Ebenen-Spezifikation
Die ACPI-Spezifikation[1] gliedert eine ACPI-Architektur in zwei Ebenen. Die erste, Hardware-nahe Ebene (Low Level) der ACPI-Architektur besteht aus:
- ACPI-Tabellen
- ACPI-Bios
- ACPI-Registern
Die ACPI-Tabellen beschreiben die ACPI-Hardware und deren Konfiguration in AML. Die zentrale Datenstruktur jedes ACPI-Systems beschreibt in Definitionsblöcken, wie die Hardware angesprochen wird. Das ACPI-Bios schreibt beim Systemstart die ACPI-Tabellen in den Speicher. Auch beim Schlafenlegen und Aufwecken (Suspend-to-RAM, Suspend-to-Disk) ist das ACPI-Bios involviert.
Die zweite Ebene (High Level) ist Teil des Betriebssystems und stellt mit einem ACPI-Core und den ACPI-Treibern ein API bereit, um auf die Low-Level-Komponenten von ACPI zuzugreifen. Der AML-Interpreter ist Teil dieser Ebene.
ACPI unter Linux 2.6
Alle ACPI-Powermanagement-Funktionen[2] fasst die Kernelkonfiguration unter »Power management options (ACPI, APM)« zusammen (siehe Abbildung 1). Wer Suspend-to-RAM nutzen will, muss unter »Code maturity level options« die Option »Prompt for development and/or incomplete code/drivers« auswählen, damit bei den ACPI-Optionen der Punkt »Sleep States« erscheint.
Abbildung 1: Kernel-2.6-Optionen für das Powermanagement per ACPI.
Beim Booten lokalisiert der Kernel mit der Funktion »acpi_boot_init()« die ACPI-Tabellen und liest sie über das ACPI-Bios aus. Von besonderer Bedeutung ist die Differentiated System Description Table (DSDT). Sie enthält die Spezifikationen der bereits vorhandenen ACPI-kompatiblen Hardwarekomponenten und deren Konfiguration.
Es ist bekannt, dass manche Hersteller defekte DSDTs in ihre Systeme integrieren. Selbst wenn der Hersteller kein Bios-Upgrade mit einem fehlerfreien DSDT anbietet und auch die Kerneloption »Relaxed AML« (»CONFIG_ACPI_RELAXED_AML«) nicht weiterhilft, ist nicht alle Hoffnung verloren: Für viele Systeme mit defektem DSDT stehen auf[3] fehlerbereinigte DSDTs zum Download bereit. Unter[4] sind die nötigen Schritte nachzulesen.
Wer Pech hat und für sein System kein fehlerloses DSDT findet, darf selbst Hand anlegen: Intel stellt einen ASL-Compiler und den AML-Disassembler »iasl«[5] zur Verfügung. Er kann die defekte DSDT über das Proc-Dateisystem (»cat /proc/acpi/dsdt > dsdt.aml«) kopieren und anschließend mit dem AML-Compiler disassemblieren. Der Befehl »iasl -d dsdt.aml« disassembliert die DSDT und schreibt den ASL-Source in der Datei »dtds.dsl« (Listing 1).
01 [root@sunshine:~]$ cp /proc/acpi/dsdt ~/dsdt
02 [root@sunshine:~]$ iasl -d ./dsdt
03 Intel ACPI Component Architecture
04 ASL Optimizing Compiler / AML Disassembler version 20030918 [Sep 18 2003]
05 Copyright (C) 2000 - 2003 Intel Corporation
06 Supports ACPI Specification Revision 2.0b
07
08 Loading Acpi table from file dsdt
09 Acpi table [DSDT] successfully installed and loaded
10 Pass 1 parse of [DSDT]
11 Pass 2 parse of [DSDT]
12 Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
13 ................................................
14 Parsing completed
15 Disassembly completed, written to "dsdt.dsl"
16 [root@sunshine:~]$ head dsdt.dsl
17 /*
18 * Intel ACPI Component Architecture
19 * AML Disassembler version 20030918
20 *
21 * Disassembly of dsdt, Thu Dec 11 17:28:16 2003
22 */
23 DefinitionBlock ("DSDT.aml", "DSDT", 1, "TOSHIB", "2000 ", 537003284)
24 {
25 Name (_S0, Package (0x04)
26 {
27 [root@sunshine:~]$
|
Nun ist es an der Zeit, den Fehler im ASL-Source zu lokalisieren, zu beheben und erneut zu kompilieren (»iasl -tc dtds.dsl«). Warnings und Errors sollte man durch Änderungen des ASL-Source (»dtds.dsl«) zu eliminieren versuchen, bevor der kompilierten DSDT zum Einsatz kommt. Tipps zum Patchen fehlerhafter DSDTs finden sich auf[6].
Ist Linux 2.6 mit ACPI-Support erst mal gebootet, lohnt ein Blick in die ACPI-Einträge im Proc- und Sys-Filesystem: Über die Einträge in »/proc/acpi« und »/sys« kann das ACPI-Interface angesprochen werden. Schreibzugriffe sind nur Root möglich. Wer »sysfs« noch nicht gemountet hat, sollte dies mit
mkdir /sys
mount -t sysfs sysfs /sys
nachholen. Der Eintrag »sysfs /sys sysfs defaults 0 0« in der Datei »/etc/fstab« sorgt dafür, dass das Sysfs beim Booten automatisch mountet.