Désactivation de la carte graphique nVidia (take 2)

La fonction vgaswitcheroo semblait fonctionner, mais la consommation du portable ne baissait pas autant qu'on pouvait l'espérer. D'après mes lectures, ce système n'est en fait pas compatibles avec les cartes nVidia Optimus actuelles.

J'ai donc essayé de désactiver la carte nVidia avec le module acpi_call en suivant les informations de l'article Éteindre le GPU mangeur de batteries. Ca a marché, mais le ventilateur s'est mis à tourner à fond, pour des raisons mystérieuses. D'après de nouvelles lectures, les appels ACPI utilisés par ce module ne sont pas corrects pour tous les portables.

La solution est venue du projet Bumblebee, dont le module bbswitch permet de désactiver correctement la carte nVidia sans affoler le ventilateur du portable. Voir la documentation sur la page du module.

Récupération des sources et compilation :

$ git clone https://github.com/Bumblebee-Project/bbswitch.git
$ cd bbswitch
$ make

Test de chargement du module :

# make load

Pas d'erreur au chargement. Voyons l'état de la carte graphique nVidia :

# cat /proc/acpi/bbswitch 
0000:01:00.0 ON

Elle est active. Essayons de l'éteindre :

# tee /proc/acpi/bbswitch <<<OFF
OFF

Dans le journal du système :

[  636.964250] bbswitch: Found integrated VGA device 0000:00:02.0: \_SB_.PCI0.GFX0
[  636.964284] bbswitch: Found discrete VGA device 0000:01:00.0: \_SB_.PCI0.PEGR.GFX0
[  636.964584] bbswitch: detected an Optimus _DSM function
[  636.964599] bbswitch: Succesfully loaded. Discrete card 0000:01:00.0 is on
[  751.666137] bbswitch: disabling discrete graphics
[  751.666451] bbswitch: Result of Optimus _DSM call: 01000059
[  751.678869] pci 0000:01:00.0: Refused to change power state, currently in D0
[  751.751359] pci 0000:01:00.0: power state changed by ACPI to D3

Il se passe des choses.

# cat /proc/acpi/bbswitch
0000:01:00.0 OFF

La carte semble bien éteinte, et la consommation électrique du portable baisse sensiblement (sur batterie, avec laptop-mode activé, elle passe à environ 12 W quand la carte graphique secondaire est éteinte).

Le changement est visible dans la liste des périphériques PCI :

# lspci -vnnn | grep VGA

00:02.0 VGA compatible controller [0300]: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller [8086:0116] (rev 09) (prog-if 00 [VGA controller])
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GF119 [GeForce GT 520MX] [10de:1051] (rev ff) (prog-if ff)

La mention VGA controller a disparu en bout de ligne pour la seconde carte.

Pour désactiver la carte au démarrage du système :

Placer le module dans le dossier idoine du système :

# cp bbswitch.ko /lib/modules/$(uname -r)/update/.
# depmod -a

Dans le fichier /etc/module, ajoutez la ligne :

bbswitch load_state=0

Régénérer l'image initramfs :

# update-initramfs -u

Redémarrer et vérifier que le module a bien été chargé :

$ lsmod | grep bb
bbswitch               12753  0

Dans le journal du système :

$ dmesg | grep bbswitch
[   17.604759] bbswitch: Found integrated VGA device 0000:00:02.0: \_SB_.PCI0.GFX0
[   17.604769] bbswitch: Found discrete VGA device 0000:01:00.0: \_SB_.PCI0.PEGR.GFX0
[   17.604884] bbswitch: detected an Optimus _DSM function
[   17.604890] bbswitch: disabling discrete graphics
[   17.605001] bbswitch: Result of Optimus _DSM call: 01000059
[   17.713437] bbswitch: Succesfully loaded. Discrete card 0000:01:00.0 is off

Dans l'arborescence /proc :

# cat /proc/acpi/bbswitch
0000:01:00.0 OFF

La carte est bien désactivée.

Activation et désactivation du pavé tactile

La combinaison de touches Fn + F9 permet théoriquement de désactiver le pavé tactile, mais ça ne fonctionne pas sur mon système Squeeze.

Pour régler le problème, j'ai récupéré un script et je l'ai associé à la touche F9.

1. Installer le paquet xinput.

2. Dans /usr/local/bin, créer le script touchpad.sh :

#!/bin/sh

DEVICE_ID=`xinput -list | grep -i touchpad | grep id= | sed 's/.*id=\([0-9]*\).*/\1/' `

if xinput -list-props $DEVICE_ID | grep "Device Enabled" | grep "1$" > /dev/null
then
       xinput set-int-prop $DEVICE_ID "Device Enabled" 8 0
else
    xinput set-int-prop $DEVICE_ID "Device Enabled" 8 1
fi

Le rendre exécutable par tout le monde.

3. Dans Système > Préférences > Raccourcis clavier, associer le script touchpad.sh à la touche F9.

J'aurais préféré l'associer à la combinaison Fn + F9, mais ça ne semble pas possible dans l'utilitaire de GNOME.