Kernel mode setting (Français)
Le Kernel-based Mode-Setting (KMS) est une procédé permettant de définir la résolution et la profondeur d'affichage dans l'espace du noyau plutôt que dans l'espace utilisateur.
L'implémentation de KMS par le noyau Linux permet une résolution native dans le framebuffer et permet une permutation instantanée vers la console (tty). KMS permet également d'utiliser des technologies plus récentes (telles que DRI2) qui contribuent à réduire les artefacts et à augmenter les performances 3D, et même les économies d'énergie depuis le noyau.
Contexte
Auparavant, la configuration de la carte vidéo était la tâche du serveur X. De ce fait, il n'était pas facile de configurer la carte vidéo. Pour cette raison, il n'était pas facile d'avoir des graphismes sophistiqués dans les consoles virtuelles. De plus, chaque fois que l'on passait de X à une console virtuelle (Ctrl+Alt+F2
), le serveur devait donner le contrôle de la carte vidéo au noyau, ce qui était lent et provoquait des scintillements. Le même processus "douloureux" se produisait lorsque le contrôle était rendu au serveur X (Alt+F7
lorsque X fonctionne en VT7).
Avec Kernel Mode Setting (KMS), le noyau est maintenant capable de définir le mode de la carte vidéo. Cela rend possible, entre autres, les graphismes sophistiqués pendant le démarrage, la console virtuelle et la permutation rapide avec X.
Installation
Tout d'abord, notez que pour toute méthode que vous utilisez, vous devez toujours désactiver :
- Toute option
vga=
dans votre chargeur d'amorçage car elle entrera en conflit avec la résolution native activée par KMS. - Toute ligne
video=
qui active un framebuffer en conflit avec le pilote. - Tout autre pilote de framebuffer (tel que uvesafb).
Démarrage tardif de KMS
Les pilotes Intel, Nouveau, ATI et AMDGPU activent déjà KMS automatiquement pour tous les chipsets, vous n'avez donc pas besoin de l'installer manuellement.
Le pilote propriétaire NVIDIA prend en charge KMS (depuis 364.12), qui doit être activé manuellement.
Démarrage précoce de KMS
KMS est généralement initialisé après l'étape initramfs. Cependant, il est possible d'activer KMS déjà pendant l'étape initramfs. Ajoutez le module requis pour le pilote vidéo au fichier de configuration initramfs :
amdgpu
pour AMDGPU, ouradeon
si vous utilisez l'ancien pilote ATI.i915
pour Intel.nouveau
pour le pilote open-source Nouveau.nvidia nvidia_modeset nvidia_uvm nvidia_drm
pour le pilote nvidia. Consultez NVIDIA (Français)#DRM kernel mode setting pour plus de détails.
mgag200
pour les cartes Matrox.- Selon la sortie vidéo de QEMU (option
-vga type
de qemu ou libvirt<video><model type='type'>
[1]):bochs
pourstd
avec qemu etvga
/bochs
avec libvirt,virtio-gpu
pourvirtio
,qxl
pourqxl
,vmwgfx
pourvmware
avec qemu etvmvga
pour libvirt,cirrus
pourcirrus
.
- Selon le mode de VirtualBox:
vmwgfx
pour VMSVGA,vboxvideo
pour VBoxVGA ou VBoxSVGA.
Les instructions de configuration d'initramfs sont légèrement différentes selon le générateur d'initramfs que vous utilisez.
mkinitcpio
Par exemple, pour activer le KMS précoce pour le pilote graphique Intel :
/etc/mkinitcpio.conf
MODULES=(... i915 ...)
intel_agp
avant i915
pour supprimer les erreurs ACPI (consultez la sortie de lsmod
sur votre système en fonctionnement pour voir si intel_agp
est chargé). Cela peut être nécessaire pour que la reprise depuis une hibernation fonctionne avec une configuration d'affichage modifiée. Si vous utilisez PRIME GPU avec Intel IGP comme GPU principal et AMD comme GPU dédié, l'ajout de intel_agp
peut entraîner des problèmes lors de la reprise après une hibernation (le moniteur ne reçoit aucun signal). Consultez [2] pour plus d'informations.Si vous utilisez un fichier EDID personnalisé (non applicable pour les résolutions intégrées), vous devez également l'intégrer dans l'initramfs :
/etc/mkinitcpio.conf
FILES=(/usr/lib/firmware/edid/your_edid.bin)
Puis régénérez l'initramfs.
Booster
Si vous utilisez Booster, vous pouvez charger les modules nécessaires avec ce changement de configuration :
/etc/booster.yaml
modules_force_load : i915
Pour ajouter des fichiers supplémentaires à l'image :
/etc/booster.yaml
extra_files : /usr/lib/firmware/edid/your_edid.bin
Puis régénérez les images booster.
Dépannage
Mes polices sont trop petites
Consultez Linux console#Fonts pour savoir comment changer la police de votre console en une grande police. La police Terminus (terminus-font) est disponible en plusieurs tailles, comme ter-132n
qui est plus grande.
Alternativement, désactiver modesetting peut passer à une résolution inférieure et faire apparaître les polices plus grandes.
Problème au démarrage et dans dmesg
L'interrogation des périphériques d'affichage connectés sur les anciens systèmes peut être assez coûteuse. L'interrogation se fait périodiquement et peut dans le pire des cas prendre plusieurs centaines de millisecondes, selon le matériel. Cela provoquera des blocages visibles, par exemple dans la lecture vidéo. Ces blocages peuvent se produire même si votre vidéo est sur la sortie HDP mais que vous avez d'autres sorties non HDP dans votre configuration matérielle. Si vous constatez des blocages de la sortie d'affichage toutes les 10 secondes, la désactivation de l'interrogation peut vous aider.
Si vous consultez un code d'erreur de 0x00000010 (2)
lors du démarrage (vous obtiendrez environ 10 lignes de texte, la dernière partie indiquant le code d'erreur), utilisez la commande suivante :
/etc/modprobe.d/modprobe.conf
options drm_kms_helper poll=0
Forcer les modes et l'EDID
Si votre résolution native n'est pas automatiquement configurée ou si aucun affichage n'est détecté, alors votre moniteur peut ne pas envoyer de fichier EDID ou seulement un fichier biaisé. Le noyau essaiera d'appréhender ce cas et définira l'une des résolutions les plus courantes.
Si vous avez le fichier EDID de votre moniteur, il vous suffit de l'appliquer explicitement (consultez ci-dessous). Cependant, le plus souvent, on n'a pas d'accès direct à un fichier sain et il est nécessaire soit d'extraire un fichier existant et de le corriger, soit d'en générer un nouveau.
La génération de nouveaux binaires EDID pour diverses résolutions et configurations est possible pendant la compilation du noyau en suivant la documentation en amont (consultez également ici pour un petit guide). D'autres solutions sont décrites en détail dans cet article.
L'extraction d'un EDID existant est dans la plupart des cas plus facile, par exemple, si votre moniteur fonctionne correctement sous Windows, vous pouvez extraire l'EDID du pilote correspondant, ou si un moniteur similaire fonctionne avec les mêmes paramètres, vous pouvez utiliser get-edid
du paquet read-edid. Vous pouvez également essayer de chercher dans /sys/class/drm/*/edid
.
Après avoir préparé votre EDID, placez-le dans un répertoire, par exemple appelé edid
sous /usr/lib/firmware
et copiez-y votre binaire.
Pour le charger au démarrage, spécifiez ce qui suit dans la ligne de commande du noyau :
drm.edid_firmware=edid/votre_edid.bin
Pour les noyaux plus anciens que 4.13, utilisez cette ligne à la place :
drm_kms_helper.edid_firmware=edid/votre_edid.bin
Afin de l'appliquer uniquement à un connecteur spécifique, utilisez
drm.edid_firmware=VGA-1:edid/votre_edid.bin
Pour les résolutions intégrées, référez-vous au tableau ci-dessous. La colonne Nom spécifie le nom que l'on est supposé utiliser afin d'imposer son usage.
Résolution | Nom |
---|---|
800x600 | edid/800x600.bin |
1024x768 | edid/1024x768.bin |
1280x1024 | edid/1280x1024.bin |
1600x1200 (kernel 3.10 ou supérieur) | edid/1600x1200.bin |
1680x1050 | edid/1680x1050.bin |
1920x1080 | edid/1920x1080.bin |
Si vous faites un démarrage précoce de KMS, vous devez inclure le fichier EDID personnalisé dans l'initramfs, sinon vous rencontrerez des problèmes.
La valeur du paramètre drm.edid_firmware
peut également être modifiée après le démarrage en écrivant dans /sys/module/drm/parameters/edid_firmware
:
# echo edid/votre_edid.bin > /sys/module/drm/parameters/edid_firmware
Ceci ne prendra effet que pour les écrans nouvellement branchés, les écrans déjà branchés continueront à utiliser leurs paramètres EDID existants. Pour les écrans externes, il suffit de les rebrancher pour consulter l'effet.
Depuis le noyau 3.15, pour charger un EDID après le démarrage, vous pouvez utiliser debugfs au lieu d'un paramètre de ligne de commande du noyau si le noyau n'est pas en mode lockdown. Ceci est très utile si vous échangez les moniteurs sur un connecteur ou simplement pour des tests. Une fois que vous avez un fichier EDID comme ci-dessus, exécutez :
# cat correct-edid.bin > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override
Et pour désactiver :
# echo -n reset > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override
Forcer les modes
video=
peut être utile dans certains scénarios.Extrait du wiki de nouveau :
- Un mode peut être forcé sur la ligne de commande du noyau. Malheureusement, l'option de ligne de commande video est mal documentée dans le cas du DRM. Des bribes sur la façon de l'utiliser peuvent être trouvées dans
Le format est le suivant
video=<conn>:<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
<conn>
: Connecteur, par exemple DVI-I-1, consultez/sys/class/drm/
pour connaître les connecteurs disponibles.<xres> x <yres>
: résolutionM
: calcul d'un mode CVT ?R
: réduction du blanking ?-<bpp>
: profondeur de couleur@<refresh>
: vitesse de rafraîchissementi
: entrelacé (mode non-CVT)m
: marges ?e
: sortie forcée actived
: sortie forcée à l'arrêtD
: sortie numérique activée de force (par exemple, connecteur DVI-I)
Vous pouvez modifier les modes de plusieurs sorties en utilisant plusieurs fois video=
, par exemple, pour forcer DVI
à 1024x768 à 85 Hz et TV-out
à être désactivé :
video=DVI-I-1:1024x768@85 video=TV-1:d
Pour obtenir le nom et l'état actuel des connecteurs, vous pouvez utiliser le shell suivant oneliner :
$ for p in /sys/class/drm/*/status ; do con=${p%/status} ; echo -n "${con#*/card?-} : " ; cat $p ; done
DVI-I-1 : connected HDMI-A-1 : disconnected VGA-1 : disconnected
Désactiver modesetting
Vous pouvez vouloir désactiver KMS pour diverses raisons. Pour désactiver KMS, ajoutez nomodeset
comme paramètre du noyau. Consultez Kernel parameters pour plus d'informations.
En plus du paramètre du noyau nomodeset
, pour les cartes graphiques Intel, vous devez ajouter i915.modeset=0
et pour les cartes graphiques Nvidia, vous devez ajouter nouveau.modeset=0
. Pour un système Nvidia Optimus avec deux cartes, vous devez ajouter les trois paramètres du noyau (c'est-à-dire "nomodeset i915.modeset=0 nouveau.modeset=0"
).