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.
ACPI : Advanced Configuration and Power Interface : Interface avancée de configuration et de gestion de l'énergie
Références
Modules ACPI : wiki archlinux : https://wiki.archlinux.org/index.php/ACPI_modules
Description des tables ACPI : documentation Microsoft : https://msdn.microsoft.com/en-us/windows/hardware/drivers/bringup/acpi-system-description-tables
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
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
Une liste de périphériques ACPI "plug and play" apparaît au démarrage du noyau dans dmesg :
# 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)
Les alias des modules, comprenant acpi dans leur nom, découverts par le noyau, sont listés dans sysfs :
# 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:
Les noms des modules correspondants lorsqu'ils existent sont donnés par modinfo :
# 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
Modules chargés
$ 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).
Les modules prenant en charge les périphériques ou fonction acpi appartiennent généralement à l'une des catégories suivantes :
Modules présents du sous-répertoire acpi :
# 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
ac.ko - état connexion secteur
battery.ko - état connexion batterie
button.ko - état couvercle - touches arrêt, veille
thermal.ko - état des capteurs thermiques
video.ko - état des périphériques vidéo (rétroéclairage, sorties vidéo)
Modules comprenant acpi dans leur nom qui ne sont pas dans le répertoire acpi :
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
Modules inclus dans le noyau comprenant acpi dans leur nom ou dans leur chemin:
$ 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
Lorsqu'il est possible de décharger un module, son effet peut-être vérifié dans dmesg et avec udevadm monitor :
Exemple : thermal
# 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)
Exemple : ac
# 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)
Exemple x86_pkg_temp_thermal
# modprobe -r x86_pkg_temp_thermal && modprobe x86_pkg_temp_thermalCe module ne gère pas un périphérique ACPI.
# dmesg |tail |grep 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 :
Installer acpi et acpid :
# apt install acpi acpid
acpi_listen affiche les événements au fur et à mesure de leur détection.
Dans l'exemple ci-dessous, on vérifie que la touche correspondant à la fonction veille est détectée :
$ acpi_listen
button/sleep SBTN 00000080 00000000
button/sleep PNP0C0E:00 00000080 00000004
De même la fermeture et l'ouverture du capot
$ acpi_listen
button/lid LID close
button/lid LID open
Dans ce deuxième exemple, on vérifie en déconnectant, puis reconnectant le secteur, que celui-ci et la batterie sont détectés :
Déconnexion secteur
$ 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
Lors de la reconnexion secteur :
$ 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