Le PC ne se met plus en veille.

La première étape consiste à comprendre pourquoi le PC ne se mettait plus en veille. Un peu de logs supplémentaires nous seraient utiles. Le plus simple pour les activer temporairement est d'exécuter la commande suivante en root:

systemctl set-environment SYSTEMD_LOG_{LEVEL=debug,TARGET=journal}
systemctl restart systemd-logind

Une fois ces commandes exécutées, on peut avoir des logs avec la commande journalctl -b -u systemd-logind:

juil. 01 08:12:22 beitou systemd-logind[22720]: Lid closed.
juil. 01 08:12:22 beitou systemd-logind[22720]: Ignoring lid switch request, 4 displays connected.
juil. 01 08:12:22 beitou systemd-logind[22720]: Ignoring lid switch request, 4 displays connected.
juil. 01 08:12:28 beitou systemd-logind[22720]: Lid opened.

Oh, j'ai donc 4 moniteurs connectés en même temps ! Ah, en fait non. Il doit donc y avoir une détection qui échoue. Pour en savoir plus, on peut demander gentiment à ACPI:

$ cat /sys/class/drm/*/*/status
unknown
unknown
unknown
unknown

Mais je m'aperçois qu'après un boot les valeurs sont correctes:

$ cat /sys/class/drm/*/*/status
disconnected
connected
disconnected
disconnected

Les valeurs deviennent incorrectes uniquement après un retour de veille. Cependant elles redeviennent normales après (par exemple) un appel à xrandr.

Après quelques rapports de bug, j'ai des pistes. Il semble que ce souci n'arrive que depuis le noyau 4.1. Après avoir appliqué le patch d'un mail de la liste du noyau, ce premier souci est corrigé. Il semble aussi que systemd v221 inclue un contournement au souci, mais je ne l'ai pas essayé.

Place aux autres soucis !

Le PC se réveille après quelques secondes.

Quelques forums m'ont mis la puce à l'oreille: il semble que ce soit le module USB qui envoie des événements de réveil.

On peut le voir en affichant /proc/acpi/wakeup:

$ cat /proc/acpi/wakeup 
Device	S-state	  Status   Sysfs node
P0P1	  S4	*disabled
XHC	  S3	*enabled  pci:0000:00:14.0
HDEF	  S4	*disabled  pci:0000:00:1b.0
RP01	  S4	*disabled  pci:0000:00:1c.0
PXSX	  S4	*disabled
RP03	  S4	*disabled  pci:0000:00:1c.2
PXSX	  S5	*disabled  pci:0000:04:00.0
PXSX	  S4	*disabled  pci:0000:05:00.0
		*disabled  platform:rtsx_pci_sdmmc.0
		*disabled  platform:rtsx_pci_ms.0
PEG0	  S4	*disabled
PEGP	  S4	*disabled
PEG1	  S4	*disabled
PEG2	  S4	*disabled
LID0	  S4	*enabled   platform:PNP0C0D:00

Cela sert normalement à réveiller le PC si le clavier est actionné, mais on dirait que des événements sont envoyés qui ne devraient pas être reçus... La solution évidente consiste à désactiver cette fonction (en root):

# echo XHC > /proc/acpi/wakeup
$ cat /proc/acpi/wakeup 
Device	S-state	  Status   Sysfs node
P0P1	  S4	*disabled
XHC	  S3	*disabled  pci:0000:00:14.0
HDEF	  S4	*disabled  pci:0000:00:1b.0
RP01	  S4	*disabled  pci:0000:00:1c.0
PXSX	  S4	*disabled
RP03	  S4	*disabled  pci:0000:00:1c.2
PXSX	  S5	*disabled  pci:0000:04:00.0
PXSX	  S4	*disabled  pci:0000:05:00.0
		*disabled  platform:rtsx_pci_sdmmc.0
		*disabled  platform:rtsx_pci_ms.0
PEG0	  S4	*disabled
PEGP	  S4	*disabled
PEG1	  S4	*disabled
PEG2	  S4	*disabled
LID0	  S4	*enabled   platform:PNP0C0D:00

Pour l'exécuter au boot, voici ce que j'ai fait.

J'ai d'abord édité /etc/systemd/system/disable-xhc-wakeup.service avec le contenu suivant:

[Unit]
Description=Disable XHC Wakeup

[Service]
ExecStart=/usr/local/bin/disable-xhc-wakeup

[Install]
WantedBy=multi-user.target 

Puis j'ai édité /usr/local/bin/disable-xhc-wakeup avec ce contenu:

#!/bin/sh

if grep -q XHC.*enabled /proc/acpi/wakeup ; then
  echo XHC > /proc/acpi/wakeup
fi

Et j'ai enfin activé ce nouveau service (en root):

# systemctl enable disable-xhc-wakeup.service

Le touchscreen ne fonctionne plus après un resume

Après un peu de recherche, j'ai découvert que simplement décharger et recharger le module hid_multitouch corrigeait le souci:

modprobe -r hid_multitouch
modprobe hid_multitouch

Il ne reste plus qu'à le faire de manière systématique.

Attention, beaucoup de documentation pointe vers /usr/lib/pm-utils/defaults, mais ce fichier n'est plus utilisé avec systemd.

J'ai donc créé un fichier /etc/systemd/system/reload_multitouch.service:

[Unit]
Description=Reload hid_multitouch kernel module
After=sleep.target

[Service]
Type=oneshot
ExecStart=/sbin/modprobe -r hid_multitouch ; /sbin/modprobe hid_multitouch

[Install]
WantedBy=sleep.target

Puis je l'ai activé:

# systemctl enable reload_multitouch

Et voilà !

J'ai rapporté le bug sur le bugtracker du noyau Linux donc vous pourrez suivre la résolution éventuelle !