ACPI - Advanced Configuration Power Interface

Selon http://wiki.osdev.org/ACPI :

ACPI (Advanced Configuration and Power Interface) is a Power Management and configuration standard for the PC, developed by Intel, Microsoft and Toshiba. ACPI allows the operating system to control the amount of power each device is given (allowing it to put certain devices on standby or power-off for example). It is also used to control and/or check thermal zones (temperature sensors, fan speeds, etc), battery levels, PCI IRQ routing, CPUs, NUMA domains and many other things.

Terminologie

Références

1 - Caractéristiques

1.1 - Version

biosdecode du paquet dmidecode permet d'afficher la version d'ACPI implantée dans le bios :

# biosdecode |head -5
# biosdecode 3.0
ACPI 2.0 present.
OEM Identifier: _ASUS_
RSD Table 32-bit Address: 0xAAFFEF18
XSD Table 64-bit Address: 0x00000000AAFFEE18

1.2 - Contenu

Pour vérifier le contenu, utiliser la version "live" de FWTS (Firmware Test Suite) : voir Bios - Firmware Test Suite (FWTS).

Le noyau standard ne permet en effet plus d'accéder à la mémoire physique.

Une liste des tables acpi est fournie par

$ ls /sys/firmware/acpi/tables/
APIC DSDT FACP FACS2 MCFG SSDT1 SSDT3 TCPA
BOOT dynamic FACS1 HPET SLIC SSDT2 SSDT4

2 - Périphériques et modules

2.1 - Périphériques "plug and play"

# dmesg |grep "ACPI:"
......
[ 0.536492] pnp: PnP ACPI: found 9 devices
[ 1.433105] ACPI: Thermal Zone [THRM] (42 C)
[ 1.443868] ACPI: bus type USB registered
[ 1.501511] ACPI: Lid Switch [LID]
[ 1.501580] ACPI: Power Button [PWRB]
[ 1.501630] ACPI: Sleep Button [SLPB]
[ 1.563873] ACPI: Video Device [GFX0] (multi-head: yes rom: yes post: no)
[ 1.566155] ACPI: Video Device [GFX0] (multi-head: yes rom: no post: no)
[ 3.222003] ACPI: AC Adapter [AC0] (on-line)
[ 3.240562] ACPI: Battery Slot [BAT0] (battery present)

2.2 - Modules

2.2.1 - Modules détectés par le système

# find /sys -name modalias -exec cat {} \; |grep acpi |sort |uniq
acpi:ACPI0003:
acpi:INT0800:
acpi:INT340E:PNP0C02:
acpi:INT3F0D:PNP0C02:
acpi:LNXCPU:
acpi:LNXSYBUS:
acpi:LNXSYSTM:
acpi:LNXTHERM:
acpi:LNXVIDEO:
acpi:PNP0000:
acpi:PNP0100:
acpi:PNP0103:
acpi:PNP0200:
acpi:PNP0303:PNP030B:
acpi:PNP0A08:PNP0A03:
acpi:PNP0B00:
acpi:PNP0C01:
acpi:PNP0C02:
acpi:PNP0C04:
acpi:PNP0C09:
acpi:PNP0C0A:
acpi:PNP0C0C:
acpi:PNP0C0D:
acpi:PNP0C0E:
acpi:PNP0C0F:
acpi:PNP0C14:
acpi:SYN0A17:SYN0A00:SYN0002:PNP0F13:
# modinfo $(find /sys -name modalias -exec cat {} \; |grep acpi |sort |uniq) |grep file |sort |uniq
modinfo: ERROR: Module acpi:INT0800: not found.
modinfo: ERROR: Module acpi:LNXSYBUS: not found.
modinfo: ERROR: Module acpi:LNXSYSTM: not found.
modinfo: ERROR: Module acpi:PNP0000: not found.
modinfo: ERROR: Module acpi:PNP0100: not found.
modinfo: ERROR: Module acpi:PNP0103: not found.
modinfo: ERROR: Module acpi:PNP0200: not found.
modinfo: ERROR: Module acpi:PNP0303:PNP030B: not found.
modinfo: ERROR: Module acpi:PNP0A08:PNP0A03: not found.
modinfo: ERROR: Module acpi:PNP0B00: not found.
modinfo: ERROR: Module acpi:PNP0C01: not found.
modinfo: ERROR: Module acpi:PNP0C04: not found.
modinfo: ERROR: Module acpi:PNP0C09: not found.
modinfo: ERROR: Module acpi:PNP0C0F: not found.
modinfo: ERROR: Module acpi:SYN0A17:SYN0A00:SYN0002:PNP0F13: not found.
filename: /lib/modules/4.9.0-0.bpo.2-amd64/kernel/drivers/acpi/ac.ko
filename: /lib/modules/4.9.0-0.bpo.2-amd64/kernel/drivers/acpi/battery.ko
filename: /lib/modules/4.9.0-0.bpo.2-amd64/kernel/drivers/acpi/button.ko
filename: /lib/modules/4.9.0-0.bpo.2-amd64/kernel/drivers/acpi/thermal.ko
filename: /lib/modules/4.9.0-0.bpo.2-amd64/kernel/drivers/acpi/video.ko
filename: /lib/modules/4.9.0-0.bpo.2-amd64/kernel/drivers/char/tpm/tpm_tis.ko
filename: /lib/modules/4.9.0-0.bpo.2-amd64/kernel/drivers/cpufreq/acpi-cpufreq.ko
filename: /lib/modules/4.9.0-0.bpo.2-amd64/kernel/drivers/cpufreq/pcc-cpufreq.ko
filename: /lib/modules/4.9.0-0.bpo.2-amd64/kernel/drivers/net/fjes/fjes.ko
filename: /lib/modules/4.9.0-0.bpo.2-amd64/kernel/drivers/platform/x86/wmi.ko
$ lsmod |grep -E "^ ac |^battery |^button |^thermal |^video |^tpm_tis |^acpi-cpufreq |^pcc-cpufreq |^fjes |^wmi " |sort
ac 16384 0
battery 16384 0
button 16384 1 i915
fjes 28672 0
thermal 20480 0
tpm_tis 16384 0
video 40960 2 asus_wmi,i915
wmi 16384 2 asus_wmi,mxm_wmi

Certains modules (acpi-cpufreq et pcc-cpufreq dans le cas présents) ne sont pas chargés (non compatibles avec d'autres modules déjà chargés ou avec le périphérique).

2.2.2 Modules disponibles

Les modules prenant en charge les périphériques ou fonction acpi appartiennent généralement à l'une des catégories suivantes :

# find /lib/modules/$(uname -r)/kernel/drivers/acpi -name *.ko |sort
/lib/modules/4.8.0-0.bpo.2-amd64/kernel/drivers/acpi/ac.ko
/lib/modules/4.8.0-0.bpo.2-amd64/kernel/drivers/acpi/acpi_ipmi.ko
/lib/modules/4.8.0-0.bpo.2-amd64/kernel/drivers/acpi/acpi_pad.ko
/lib/modules/4.8.0-0.bpo.2-amd64/kernel/drivers/acpi/battery.ko
/lib/modules/4.8.0-0.bpo.2-amd64/kernel/drivers/acpi/button.ko
/lib/modules/4.8.0-0.bpo.2-amd64/kernel/drivers/acpi/dptf/dptf_power.ko
/lib/modules/4.8.0-0.bpo.2-amd64/kernel/drivers/acpi/fan.ko
/lib/modules/4.8.0-0.bpo.2-amd64/kernel/drivers/acpi/nfit/nfit.ko
/lib/modules/4.8.0-0.bpo.2-amd64/kernel/drivers/acpi/sbshc.ko
/lib/modules/4.8.0-0.bpo.2-amd64/kernel/drivers/acpi/sbs.ko
/lib/modules/4.8.0-0.bpo.2-amd64/kernel/drivers/acpi/thermal.ko
/lib/modules/4.8.0-0.bpo.2-amd64/kernel/drivers/acpi/video.ko
find /lib/modules/$(uname -r) -name *.ko |grep -v "/acpi/" |grep acpi |sort
/lib/modules/4.9.0-0.bpo.1-amd64/kernel/drivers/cpufreq/acpi-cpufreq.ko
/lib/modules/4.9.0-0.bpo.1-amd64/kernel/drivers/hwmon/acpi_power_meter.ko
/lib/modules/4.9.0-0.bpo.1-amd64/kernel/drivers/iio/light/acpi-als.ko
/lib/modules/4.9.0-0.bpo.1-amd64/kernel/drivers/mfd/intel-lpss-acpi.ko
/lib/modules/4.9.0-0.bpo.1-amd64/kernel/drivers/mmc/host/sdhci-acpi.ko
/lib/modules/4.9.0-0.bpo.1-amd64/kernel/drivers/pci/hotplug/acpiphp_ibm.ko
/lib/modules/4.9.0-0.bpo.1-amd64/kernel/drivers/platform/x86/thinkpad_acpi.ko
/lib/modules/4.9.0-0.bpo.1-amd64/kernel/drivers/platform/x86/toshiba_acpi.ko
/lib/modules/4.9.0-0.bpo.1-amd64/kernel/drivers/thermal/int340x_thermal/acpi_thermal_rel.ko
/lib/modules/4.9.0-0.bpo.1-amd64/kernel/drivers/xen/xen-acpi-processor.ko
/lib/modules/4.9.0-0.bpo.1-amd64/kernel/sound/soc/intel/atom/sst/snd-intel-sst-acpi.ko
/lib/modules/4.9.0-0.bpo.1-amd64/kernel/sound/soc/intel/common/snd-soc-sst-acpi.ko
$ cat /lib/modules/$(uname -r)/modules.builtin |sort|grep acpi
kernel/drivers/acpi/acpi_extlog.ko
kernel/drivers/acpi/hed.ko
kernel/drivers/acpi/processor.ko

3 - Vérifications

3.1 - Prise en compte par le noyau

Lorsqu'il est possible de décharger un module, son effet peut-être vérifié dans dmesg et avec udevadm monitor :

# modprobe -r thermal && modprobe thermal

# dmesg |tail -2
[ 2434.520390] thermal LNXTHERM:00: registered as thermal_zone0
[ 2434.520392] ACPI: Thermal Zone [THRM] (42 C)

# udevadm monitor -k
KERNEL[2500.943989] remove /devices/virtual/hwmon/hwmon0 (hwmon)
KERNEL[2500.944232] remove /devices/virtual/thermal/thermal_zone0 (thermal)
KERNEL[2500.944325] remove /bus/acpi/drivers/thermal (drivers)
KERNEL[2500.944497] remove /module/thermal (module)
KERNEL[2512.657023] add /module/thermal (module)
KERNEL[2512.657707] add /devices/virtual/thermal/thermal_zone0 (thermal)
KERNEL[2512.657760] add /devices/virtual/hwmon/hwmon0 (hwmon)
KERNEL[2512.928327] add /bus/acpi/drivers/thermal (drivers)
# modprobe -r ac && modprobe ac

# dmesg |tail -1
[ 3404.344214] ACPI: AC Adapter [AC0] (on-line)

# udevadm monitor -k
KERNEL[2927.992299] remove /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/ACPI0003:00/power_supply/AC0 (power_supply)
KERNEL[2927.992331] remove /bus/acpi/drivers/ac (drivers)
KERNEL[2927.992399] remove /module/ac (module)
KERNEL[2928.013910] add /module/ac (module)
KERNEL[2928.014143] add /bus/acpi/drivers/ac (drivers)
KERNEL[2928.028619] change /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/ACPI0003:00/power_supply/AC0 (power_supply)
# modprobe -r battery && modprobe battery

# dmesg |tail -1
[ 3235.251650] ACPI: Battery Slot [BAT0] (battery present)
# modprobe -r x86_pkg_temp_thermal && modprobe x86_pkg_temp_thermal

# dmesg |tail |grep ACPI
Ce module ne gère pas un périphérique ACPI.

3.2 - Test des périphériques acpi

L'utilisation des paquets acpi et acpid pour gérer les évènements acpi est dépréciée. Toutefois, ils peuvent être utilisés pour obtenir des informations complémentaires sur les périphériques acpi, tels que fermeture couvercle, touches de mise en veille, connexion secteur et batterie :

# apt install acpi acpid

acpi_listen affiche les événements au fur et à mesure de leur détection.

$ acpi_listen 
button/sleep SBTN 00000080 00000000
button/sleep PNP0C0E:00 00000080 00000004
$ acpi_listen
button/lid LID close
button/lid LID open
$ acpi_listen 
ac_adapter ACPI0003:00 00000080 00000000
PNP0C14:01 000000ff 00000000
processor LNXCPU:00 00000081 00000000
processor LNXCPU:01 00000081 00000000
processor LNXCPU:02 00000081 00000000
processor LNXCPU:03 00000081 00000000
battery PNP0C0A:00 00000080 00000001
$ acpi_listen
ac_adapter ACPI0003:00 00000080 00000001
PNP0C14:01 000000ff 00000000
processor LNXCPU:00 00000081 00000000
processor LNXCPU:01 00000081 00000000
processor LNXCPU:02 00000081 00000000
processor LNXCPU:03 00000081 00000000
battery PNP0C0A:00 00000080 00000001