Guide pour la gestion et la correction de l'ACPI sous Linux

par



Ce document à pour but de vous expliquer comment résoudre les problèmes liées à l'ACPI sous Linux.
Il s'appuit sur mon cas particulier mais tente d'expliquer les corrections à apporter en général. Je possède un Compaq Presario 2710EA et mon ACPI est buggé. C'est à dire que sans intervention de ma part, je ne peux exploiter les informations fournies par le BIOS sur l'état du portable (connexion secteur, battery, vitesse du processeur...).
La solution est de récupérer le code machine de l'ACPI dans le BIOS, de le corriger puis de recompiler son noyau en lui donnant en pâture le nouveau code de l'ACPI. Ainsi, le noyau s'appuiera sur le code modifié pour obtenir toutes les informations fournies par l'ACPI.
ATTENTION: Les manipulations suivantes ne sont pas à la porté du premier venu. Faites bien attention à ce que vous faîtes et ne tenter pas les modifications au hasard... Vous devez en outre avoir l'expérience de la recompilation de votre noyau. C'est une partie que je ne détaille pas. Vous voilà prévenu...



On est parti.

Voici les quelques petites choses dont vous aurez besoin:
Les sources du noyau (ben oui, on va recompiler le noyau)
pacpidump (qui servira à récupérer son DSDT)
iasl (il s'agit du compilateur/décompilateur fourni par Intel nécessaire pour modifier le DSDT). Prenez la dernière version disponible (la version linux hein...).
Le patch ACPI pour le noyau (la dernière version disponible et comptatible avec le version du noyau que vous allez recompiler évidemment)

Dézippez et détarrez pacpidump.tar.gz et iasl-linux-XXXXXXXX.tar.gz
tar xzvf pacpidump.tar.gz
tar xzvf iasl-linux-XXXXXXXX.tar.gz

Il faut récupérer tout d'abord le DSDT, il s'agit du fichier à corriger.
./acpidump > dsdt.asl

(il existe une autre méthode qui est de booter avec un kernel patché à la sauce ACPI, mais buggé, puis de récupérer le fichier /proc/acpi/dsdt, puis de le décompiler avec ./iasl -d dsdt mais comme iasl est en constante évolution, il existe des bug dans la décompilation (un comble...))

Bref, une fois que vous avez votre dsdt.asl, vous pouvez tout de suite tenter de le compiler par un ./iasl -tc dsdt.asl. Et là, vous avez des erreurs et/ou des warnings (sinon, c'est même pas la peine de continuer, votre DSDT est correct).
Pour corriger les erreurs affichées, une seul solution: éditez votre fichier dsdt.asl et lire ce document: acpi-howto.html. Il référence les types d'erreurs que vous risquez d'avoir et les fix à y apporter.
(ne jouez pas au malin avec votre DSDT, du genre mettre entre /* et */ toutes les lignes à problème, à moins que vous vouliez faire de votre ordi un grand feu de joie...)

Quand vous arriverez à compiler le DSDT sans erreur et sans warning, c'est gagné. Le reste, c'est de la bidouille.

Patch du noyau

Alors, on patch notre noyau avec le dernier patch ACPI à la mode
gzip -d acpi-20021126-2.4.20-rc3.diff.gz
(dans le répertoire des sources) patch -p1 < acpi-20021126-2.4.20-rc3.diff

Ensuite, on copie le DSDT compilé: cp dsdt.hex /usr/src/linux-2.4.20/drivers/acpi/include/dsdt_table.h

Il reste à modifier le fichier /usr/src/linux-2.4.20/drivers/acpi/osl.c pour que le noyau prenne en compte notre DSDT corrigé:

on ajoute la ligne
#include "dsdt_table.h"
au début des includes du fichier et on remplace (vers les lignes 200/210)
acpi_status
acpi_os_table_override (acpi_table_header *existing_table, acpi_table_header **new_table)
{
if (!existing_table || !new_table)
return AE_BAD_PARAMETER;

*new_table = NULL;
return AE_OK;
}
par
acpi_status
acpi_os_table_override (acpi_table_header *existing_table, acpi_table_header **new_table)
{
if (!existing_table || !new_table)
return AE_BAD_PARAMETER;

*new_table = (strncmp(existing_table->signature, DSDT_SIG, 4)) ? NULL : (acpi_table_header *) AmlCode;
return AE_OK;
}

Il ne reste plus qu'à compiler notre nouveau noyau en activant l'ACPI (dans General setup). Ne mettez pas l'ACPI en module car ca risque de ne pas marcher...
Rebootez sur votre nouveau noyau. Vous devez trouver mention de la gestion de l'ACPI dans votre dmesg et vous devez avoir un répertoire /proc/acpi.

Félicitations, vous avez corrigé votre ACPI


Vérifier cette page! Mes adresses