David Schlachter

FreeBSD sur le Lenovo Thinkpad T480

Dernière mise à jour : le 28 octobre, 2020

J'ai récemment remplacé mon MacBook Air 2014 par un Lenovo Thinkpad T480, sur lequel j'ai installé FreeBSD, présentement 12.2-RELEASE. Cette page vise à documenter ma configuration et des problèmes que j'ai résolus.

Ce qui fonctionne:

Ce qui ne fonctionne pas: Bluetooth (provoque une panne lors du redémarrage, pas de pilote disponible en tout cas), 802.11ac (toujours pas implémenté dans FreeBSD). Je n'ai pas de périphérique Thunderbolt pour tester et je n'ai pas de capteur d'empreinte digitale installé.

X11 (Xorg) et Intel Graphics

Pour utiliser l'interface Intel intégrée avec Xorg, il faut installer les pilotes du paquet drm-fbsd12.0-kmod (métapaquet drm-kmod). J'ai eu plus de succès en les compilant avec ports qu'en les installant avec pkg (par exemple, avec la mise à jour de 12.0-RELEASE à 12.1-RELEASE). Après l'installation, ajouter
kld_list="/boot/modules/i915kms.ko"
à /etc/rc.conf pour les charger au démarrage.

Pour Xorg, je préfère le pilote xf86-video-intel. Le pilote par défaut modesetting souffre d'une mauvaise synchronisation verticale ('screen tearing'). Après d'installer xf86-video-intel, il est mieux d'utiliser l'option d'accélération SNA (l'alternatif, UXA, est très lent). J'utilise la configuration suivante dans /usr/local/etc/X11/xorg.d.conf/ :

# /usr/local/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
 Identifier "Intel Graphics"
 Driver "intel"
 Option "AccelMethod" "SNA"
 Option "TearFree" "true"
EndSection

Pavé tactile & TrackPoint

Depuis que udev/libinput a été intégré dans la configuration par défaut de xorg-server, c'est plus facile qu'avant de configurer le pavé tactile. Ma configuration est inspirée par un article par Michael Gmelin.

J'ajoute que si kern.evdev.rcpt_mask est mis à 12 plutôt qu'à 6 (comme suggéré par le paquet xorg-server), j'ai trouvé qu'un plus grand nombre de touches sont disponibles dans Xorg pour être configurés comme raccourcis.

Pour configurer le pavé tactile, les boutons et le TrackPad, j'utilise la configuration suivante dans /usr/local/etc/X11/xorg.conf.d/10-input.conf :

Section "InputClass"
Identifier "libinput keyboard catchall"
MatchIsKeyboard "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
Option "XkbRules" "evdev"
EndSection

Section "InputClass"
Identifier "libinput touchpad catchall"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
Option "NaturalScrolling" "on"
Option "Tapping" "on"
Option "DisableWhileTyping" "on"
Option "AccelSpeed" "0.42"
EndSection

Réseaux WiFi bande 5GHz

Les réseaux WiFi sur la bande 5 GHz ne seront pas visibles à moins que le code pays soit défini pour l'interface. Je mis la ligne suivante dans /etc/rc.conf pour le configurer (dans ce cas, pour Canada) :
ifconfig_wlan0="WPA country CA powersave"

La connectivité WiFi est aussi limitée aux vitesses de 802.11g pour la carte sans fil Intel 8265. J'ai tenté d'utiliser le PCI passthrough avec une machine virtuelle Linux sur bhyve pour accéder aux vitesses 802.11ac, mais tout cela ne fonctionne toujours pas avec la mise en veille.

Mise en veille et réveil

Pour activer la mise en veille en fermant l'ordinateur, ajouter hw.acpi.lid_switch_state=S3 à /etc/sysctl.conf.

Pour que la mise en veille fonctionne, il faut désactiver la puce TPM dans le BIOS. Les puces TPM prises en charge sont énumérées dans man tpm et il semble que celle du T480 n'est pas supportée. Selon le manuel, la puce TPM doit sauvegarder ses renseignements avant de la mise en veille, faute de quoi celle-ci échouera.

Luminosité de l'écran

J'utilise acpi_video, voir mon article détaillé sur comment contrôler la luminosité.

Audio

Avec 12.2-RELEASE, il n'y a pas de problème avec le son.

Sur 12.1-RELEASE, l'audio est bon sur les haut-parleurs, mais terrible sur la prise casque, plein de bruit et de distorsion. Dès mars 2020, ce problème n'est pas présent dans 12.1-STABLE ou 13.0-CURRENT (je suppose que ça a été résolu dans r351325). Pour une résolution provisoire, j'ai téléchargé la code source pour le pilote hda de la branche stable (stable/12/sys/dev/sound/pci/hda/) au dossier correspondant dans /usr/src. J'ai ensuite récompilé le noyau et ses modules. Jusqu'à ce que ces modifications soient intégrées dans la branche RELEASE, cette procédure règle le problème.

Caméra

La caméra infrarouge est la seule option offerte avec l'écran WQHD. La configuration par défaut de webcamd n'active que la caméra infrarouge, pas celle de lumière visible!

usbconfig montre les deux caméras :

ugen0.2: <Bison Integrated IR Camera> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE (500mA)
ugen0.3: <SunplusIT Inc Integrated Camera> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE (500mA)

Pour utiliser la caméra de lumière visible, il faut définir webcamd_0_flags dans /etc/rc.conf pour spécifier lequel appareil utiliser, par exemple
webcamd_enable="YES"
webcamd_0_flags="-d ugen0.3 -B"

Alternativement, les deux caméras peuvent être configurées (voir /etc/rc.conf ci-dessous).

Pour utiliser la caméra dans Firefox, j'ai dû ajouter mon utilisateur au groupe webcamd ainsi qu'installer v4l-utils et v4l_compat.

Gestionnaire de fenêtre (i3) et problèmes HiDPI

Pour supporter une résolution HiDPI, le facteur d'échelle doit être défini avec xrandr. Je le fais dans .xinitrc :

xrandr --dpi 140 && xrdb -merge $HOME/.Xresources
exec i3 # start the window manager

Pour i3wm, la configuration générée est plus limitée que celle sans fichier de configuration (d'exécution). Je suggère de copier le fichier par défaut comme un point de départ :
mkdir -p ~/.i3 && cp /usr/local/etc/i3/config ~/.i3/config

Pour augmenter la taille du curseur, il faut spécifier un thème comportant plusieurs tailles de curseur dans .Xresources :

Xcursor.size: 48
Xcursor.theme: whiteglass

Cependant, j'ai dû ajouter une liaison symbolique pour que cela fonctionnait :
ln -s /usr/local/share/icons ~/.icons

Il pourrait être nécessaire de définir le même thème pour des applications GTK (Firefox, xfce4-terminal) dans ~/.config/gtk-3.0/settings.ini et ~/.gtkrc-2.0.

Pour utiliser un moniteur externe avec une densité en pixels différente (par exemple, de 96 ppi) calculer premièrment le quotient des densités en pixels du moniteur hidpi / moniteur externe (dans mon cas, 140 / 96 = 1,485). Le moniteur externe peut être configuré avec cette résolution avec une commande comme :

xrandr --output "HDMI-2" --mode 1920x1080 --scale 1.485x1.485 --right-of "eDP-1"

Il se peut que le curseur ne puisse pas accéder à tout l'aire du moniteur externe, ce qui semble être un bogue connu dont je n'ai pas toujours trouvé de résolution.

Fichiers de configuration

/etc/rc.conf

#
# Added by installer
#
clear_tmp_enable="YES"
syslogd_flags="-ss"
sendmail_enable="NONE"
hostname="t480"
ntpdate_enable="YES"
ntpd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"
zfs_enable="YES"

# Power saving, see https://www.c0ffee.net/blog/freebsd-on-a-laptop/
powerdxx_enable="YES"
performance_cx_lowest="Cmax"
economy_cx_lowest="Cmax"

# Intel Graphics driver
kld_list="/boot/modules/i915kms.ko"

# Readable font size at console
allscreens_flags="-f terminus-b32"

# For XOrg
dbus_enable="YES"

# Don't pause during boot for DHCP
background_dhclient="YES"

# Networking; use ethernet if available, otherwise use WiFi
# https://www.freebsd.org/doc/handbook/network-aggregation.html
ifconfig_em0="up"
wlans_iwm0="wlan0"
ifconfig_wlan0="WPA country CA powersave"
create_args_wlan0="wlanaddr 98:fa:9b:6c:e4:4f"
# Same as em0 MAC address cloned_interfaces="lagg0"
ifconfig_lagg0="up laggproto failover laggport em0 laggport wlan0 DHCP"

# Webcam
webcamd_enable="YES"
webcamd_0_flags="-d ugen0.3" # visible light camera
webcamd_1_flags="-d ugen0.2" # IR camera

# CUPS (allow printing)
cupsd_enable="YES"

/etc/sysctl.conf

# Added by the installer
security.bsd.unprivileged_read_msgbuf=0
security.bsd.unprivileged_proc_debug=0
kern.randompid=1
vfs.zfs.min_auto_ashift=12

# Allow sleep on lid close
hw.acpi.lid_switch_state=S3

# Disable system bell / bell everywhere
kern.vt.enable_bell=0

# Allow mounting FUSE filesystems
vfs.usermount=1

/boot/loader.conf

# Added by installer
aesni_load="YES"
geom_eli_load="YES"
security.bsd.allow_destructive_dtrace=0
kern.geom.label.disk_ident.enable="0"
kern.geom.label.gptid.enable="0"
zfs_load="YES"

# Improved power and video support
acpi_ibm_load="YES"
# For webcam
cuse_load="YES"

# WiFi
if_iwm_load="YES"
iwm8265fw_load="YES"

# Touchpad driver
hw.psm.synaptics_support="1"

# FUSE
fusefs_load="YES"

# Place devices in low power state when suitable driver not found
# (man 4 pci)
hw.pci.do_power_nodriver=3