16.3. ACPI

ACPI sta per Advanced Configuration and Power Interface. ACPI permette al sistema operativo di configurare e controllare singolarmente le componenti di hardware. In tal maniera ACPI sostituisce sia il “plug and play” che l' APM. In più l'ACPI fornisce una serie di informazioni riguardanti la batteria, la temperatura, l'alimentatore e la ventola nonché segnala eventi di sistema del tipo “Abbassare il display” o “Batteria quasi scarica ”.

Il BIOS mette a disposizione delle tabelle in cui trovare i dati sulle singole componenti e sui metodi per accedere all'hardware. Il sistema operativo utilizza queste informazioni per assegnare ad es. degli interrupt oppure per accendere e spegnere delle componenti. Visto che il sistema operativo esegue istruzioni che si trovano nel BIOS anche qui molto dipende dalla implementazione del BIOS. In /var/log/boot.msg trovate i messaggi di boot e le tabelle rilevate e lette correttamente da ACPI. Per maggiori informazioni sul modo di risolvere dei problemi dovuti all'ACPI rimandiamo alla sezione  Section 16.3.4, “Possibili problemi e soluzioni”.

16.3.1. Nella prassi

Se all'avvio il kernel rivela un BIOS ACPI, l' ACPI verrà abilitato automaticamente (ed l'APM disabilitato). Il parametro di avvio acpi=on è richiesto al massimo con macchine datate. Chiaramente il computer dovrà supportare ACPI 2.0 o versioni successive. Nei messaggi di boot del kernel in /var/log/boot.msg

In seguito bisogna caricare una serie di moduli. Questi vengono caricati dallo script di avvio del demone di ACPI. Se uno di questi moduli dovesse creare dei problemi, in /etc/sysconfig/powersave/common potrete stabilire se caricarlo o meno. Nel file di log del sistema (/var/log/messages) vedete le comunicazioni dei moduli e si può vedere quali componenti sono state rilevate.

A questo punto sotto /proc/acpi avrete una serie di file che vi informano sullo stato del sistema o grazie ai quali è possibile intervenire attivamente su determinati stati. Comunque alcune funzionalità non funzionano in modo ineccepibile visto che si trovano ancora nello stato sperimentale e dipendono dalla implementazione del produttore.

Tutti i file (tranne dsdt e fadt) possono essere letti con cat. Si possono modificare le impostazioni di alcuni di questi file passando con echo X <file> dei valori appropriati per X. Per poter accedere a queste informazioni e possibilità di intervento utilizzate sempre il comando powersave. Per una migliore comprensione ecco i file più importanti:

/proc/acpi/info

Informazioni generali su ACPI

/proc/acpi/alarm

Qui potete impostare quando si debba risvegliare il sistema. Attualmente comunque questa funzionalità non è ancora sufficientemente supportata.

/proc/acpi/sleep

Informa sui possibili stati di dormiveglia.

/proc/acpi/event

Qui vengono segnalati tutti gli eventi che vengono elaborati dal demone di powersaved. Se non vi accede alcun demone, gli eventi possono essere visualizzati con catproc/acpi/event (terminare con Ctrl-C ), eventi appartenenti a questa categoria si hanno ad esempio se si preme brevemente sul pulsante per l'accensione o se si abbassa il display.

/proc/acpi/dsdt e /proc/acpi/fadt

Qui trovate le tabelle ACPI: DSDT (Differentiated System Description Table) e FADT Fixed ACPI Description Table) che possono essere lette con acpidmp,acpidisasm e dmdecode. Questi programmi e la relativa documentazione si trovano nel pacchetto pmtools. Esempio: acpidmp DSDT | acpidisasm.

/proc/acpi/ac_adapter/AC/state

L'alimentatore è connesso?

/proc/acpi/battery/BAT*/{alarm,info,state}

Informazioni dettagliate sullo stato delle batterie. Per vedere quanto sia carica la batteria bisogna confrontare last full capacity di info con remaining capacity di state oppure ricorrere a dei programmi speciali che vengono illustrati nella sezione Section 16.3.3, “Ulteriori tool”. In alarm potete impostare un valore per innescare un evento di batteria.

/proc/acpi/button

Qui trovate delle informazioni su vari bottoni.

/proc/acpi/fan/FAN/state

Indica se la ventola è in funzione. Essa può venir accesa o spenta manualmente immettendo 0 (=on) o 3 (=off) in questo file. Comunque dovete considerare che sia il codice ACPI nel kernel che anche l'hardware (o il BIOS) possono sovrascrivere questa impostazione se vi è surriscaldamento.

/proc/acpi/processor/CPU0/info

Informazioni sulle possibilità di risparmio energetico per il processore.

/proc/acpi/processor/CPU*/power

Informazioni sullo stato attuale del processore. Un asterisco vicino a C2 sta per inattività; questo è lo stato più frequente, come mostra la cifra usage.

/proc/acpi/processor/CPU*/throttling

Qui potete impostare il throttling del processore. Spesso è possibile avere otto livelli di throttling, indipendentemente dagli interventi sulla frequenza della CPU.

/proc/acpi/processor/CPU*/limit

Se un demone regola automaticamente la performance ed il throttling, qui potete impostare i limiti che non devono essere superati. Vi sono dei limiti stabiliti dal sistema e limiti impostabili dall'utente.

/proc/acpi/thermal_zone/

Qui vi è una sottodirectory per ogni zona termica; una zona termica è un settore con simili caratteristiche termiche, il cui numero e denominazione vengono stabiliti dal produttore. Le tante possibilità offerte da ACPI spesso non vengono implementate. Di solito il controllo termico viene effettuato direttamente dal BIOS senza che il sistema abbia voce in capitolo, visto che si tratta niente popo di meno che della possibile durata del vostro hardware. Le descrizioni che seguono sono in parte meramente di natura teorica.

/proc/acpi/thermal_zone/*/temperature

La temperatura attuale della zona termica.

/proc/acpi/thermal_zone/*/state

Indica se tutto è “ok” o se (ACPI) raffredda in modo “attivo” o “passivo”. Lo stato è “ok” se il controllo della ventola non dipende dall'ACPI.

/proc/acpi/thermal_zone/*/cooling_mode

Qui si può selezionare il metodo di raffreddamento preferito, controllato dall'ACPI: passivo (meno performance, ma risparmio considerevole) o attivo (sempre a tutta potenza e ventola al massimo).

/proc/acpi/thermal_zone/*/trip_points

Qui potete impostare a partire da quale temperatura si debba intervenire. Si va dal raffreddamento attivo o passivo, alla sospensione (“hot”) fino allo spegnimento del computer (“critical”). Le possibili azioni da eseguire variano da dispositivo a dispositivo e sono definite nel DSDT. I trip point stabiliti nella specificazione ACPI sono: critical, hot, passive, active1 ed active2. Anche se non sono implementati tutti, vanno indicati in questa sequenza nel file trip_points. Ad esempio echo 90:0:70:0:0 > trip_points imposta il limite di temperatura per critical su 90 e per passive su70.

/proc/acpi/thermal_zone/*/polling_frequency

Se il valore temperature non viene aggiornato automaticamente, non appena cambia la temperatura si può passare al “modo polling”. Il comando echo X > /proc/acpi/thermal_zone/*/polling_frequency fa sì che la l'indicazione della temperatura venga aggiornata ogni X secondi. ConX=0 si disabilita nuovamente il “polling”.

16.3.2. Controllo del livello di attività del processore

Vi sono tre modi per realizzare il risparmio energetico per la CPU che possono essere combinati in base al modo operativo del sistema. Risparmio energetico vuol dire anche il sistema si riscalda di meno e che quindi si dovrà attivare di meno la ventola.

Frequenza e voltaggio

PowerNow! e Speedstep sono delle espressioni coniate da AMD e Intel per definire questo tipo di funzionalità, che comunque è presente anche su processori di altri produttori. Tramite queste funzionalità viene ridotta la frequenza di clock e il voltaggio della CPU. Il vantaggio derivante è che si realizza un risparmio energetico che è superiore a quello lineare. Tradotto in altri termini: con una frequenza ridotta della meta che corrisponde ad un livello di performance dimezzato si realizza un risparmio energetico che va decisamente oltre al 50%. Questa funzionalità è indipendente dall' APM o ACPI e richiede la presenza di un daemon, che interviene sulla frequenza ed i livelli di performance richiesti in un dato momento. Per eseguire delle impostazioni andate nella directory /sys/devices/system/cpu/cpu*/cpufreq/.

Throttling

In questo caso viene ignorata una determinata percentuale di impulsi. Con un throttling del 25% viene ignorato ogni quarto impulso, con un throttling del 87,5% solo ogni ottavo impulso raggiunge il processore. Il livello di risparmio energetico realizzato non è lineare. Il throttling trova applicazione in quei casi in cui non vi è altro modo di regolare la frequenza della cpu o per realizzare il massimo di risparmio energetico. Per gestire questo processo vi è /proc/acpi/processor/*/throttling.

Stato di dormiveglia del processore

Il processore viene indotto dal sistema operativo in uno stato per così dire di dormiveglia ogni volta che vi è inattività. In questi casi il sistema operativo invia alla CPU l'istruzione halt. Vi sono diversi livelli di dormiveglia: C1, C2 e C3. Lo stato con il maggior risparmio è C3, nel quale la cache del processore non viene addirittura neanche sincronizzata con la RAM, ragione per cui il sistema può entrare in questo stato solo se non vi è nessun dispositivo che con la sua attività al master bus modifica il contenuto della RAM. Alcuni driver impediscono perciò l'utilizzo di C3. Lo stato attuale viene indicato in /proc/acpi/processor/*/power.

Sia la riduzione della frequenza che il throttling hanno senso se applicati con il processore sotto carico, durante fasi di inattività si entra in ogni caso negli stati C volti al risparmio.

A CPU attiva la riduzione della frequenza rappresenta la soluzione da preferire ai fini del risparmio energetico. Spesso il processore non lavora toccando i propri limiti, in questi casi basta che venga ridotta la frequenza. Per un adattamento dinamico della frequenza si consiglia di ricorrere ad un daemon (ad es. powersaved). Se il sistema viene alimentato a batteria o se il computer debba raffreddarsi o operare silenziosamente si consiglia di impostare stabilmente una frequenza bassa.

Si dovrebbe ricorrere al throttling solo se non vi sono altre possibilità, ad esempio se si vuole prolungare il più possibile la durata della batteria con il sistema sotto pieno carico. Alcuni sistemi però presentano delle disfunzione se vi è un throttling troppo elevato. Con una CPU quasi a riposo non si trae alcun beneficio dal throttling.

Sotto queste funzionalità vengono gestite dal deamon powersave. La configurazione richiesta viene illustrata in una sezione propria (si veda Section 16.5, “Il pacchetto powersave”).

16.3.3. Ulteriori tool

Vi è una serie di strumenti ACPI più o meno estesi, tra cui una serie di tool di informazione che mostrano lo stato della batteria, temperatura etc.: (acpi, klaptopdaemon, wmacpimon, etc.). Alcuni semplificano l'accesso alle strutture sotto /proc/acpi oppure consentono di osservare le variazioni (akpi, acpiw, gtkacpiw). Inoltre vi sono dei tool per editare le tabelle ACPI nel BIOS (il pacchetto pmtools).

16.3.4. Possibili problemi e soluzioni

Potrebbero esserci degli errori passati inosservati nel codice ACPI del kernel, comunque in questi casi - non appena vengono scoperti - sarà messa a disposizione la correzione da poter scaricare da Internet. Problemi più spinosi e che si verificano più spesso sono dei problemi da ricondurre al BIOS. A volte succede il BIOS presenta delle discrepanze rispetto alla specificazione ACPI per aggirare degli errori nella implementazione ACPI di altri sistemi operativi largamente diffusi. Vi è anche dell'hardware riportata in cosiddette black list che a causa di gravi errori nella implementazione ACPI non possono essere utilizzate con l'ACPI del kernel Linux.

Dunque se dovessero verificarsi delle difficoltà si dovrebbe innanzitutto aggiornare il BIOS. Tante difficoltà si risolvono in questa maniera da sé. Se si verificano delle difficoltà durante il boot, provate con uno dei seguenti parametri di avvio:

pci=noacpi

non usare ACPI per la configurazione di dispositivi PCI.

acpi=oldboot

usare ACPI solo per eseguire una semplice configurazione delle risorse .

acpi=off

non utilizzare ACPI.

[Warning]Difficoltà all'avvio senza ACPI

Alcuni computer recenti soprattutto sistemi SMP ed AMD64 richiedono l'ACPI ai fini di una corretta configurazione dell'hardware. Disabilitare l'ACPI può comportare delle difficoltà.

Analizzate in questi casi i messaggi di boot, utilizzate a riguardo per esempio il comando dmesg | grep -2i acpi (o tutti i messaggi, poiché il problema non è necessariamente legato all'ACPI). Se si verifica un errore durante la lettura di una tabella ACPI potrete almeno per la tabella più importante, la DSDT, integrare una tabella ottimizzata nel kernel. In tal modo viene ignorata la tabella DSDT del BIOS che contiene degli errori. La procedura da seguire viene illustrata nella sezione Section 16.5.4, “Troubleshooting”.

Nella configurazione del kernel potrete abilitare le comunicazioni di debug dell'ACPI, una volta compilato ed installato un kernel con ACPI debugging, le informazioni dettagliate raccolte saranno di aiuto a coloro (esperti) che cercheranno di individuare l'errore.

Comunque nel caso di problemi dovuti al BIOS o all'hardware è sempre bene rivolgersi al produttore, anche se non potrà aiutarvi per Linux, comunque noterà che sono sempre più gli utenti che usano Linux e prenderà la questione sul serio.

16.3.4.1. Ulteriore documentazione