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 :
- pour AMDGPU, ou si vous utilisez l'ancien pilote ATI.
- pour Intel.
nouveau
pour le pilote open-source Nouveau.nvidia nvidia_modeset nvidia_uvm nvidia_drm
pour le pilote . Consultez NVIDIA (Français)#DRM kernel mode setting pour plus de détails.
- pour les cartes Matrox.
- Selon la sortie vidéo de QEMU (option de qemu ou libvirt ):
- pour avec qemu et / avec libvirt,
- pour
virtio
, - pour ,
vmwgfx
pour avec qemu et pour libvirt,- pour .
- Selon le mode de VirtualBox:
vmwgfx
pour VMSVGA,- 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 :
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 :
Puis régénérez l'initramfs.
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 () est disponible en plusieurs tailles, comme 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 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 du paquet . Vous pouvez également essayer de chercher dans .
Après avoir préparé votre EDID, placez-le dans un répertoire, par exemple appelé sous 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 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
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]
- : Connecteur, par exemple DVI-I-1, consultez pour connaître les connecteurs disponibles.
- : résolution
- : calcul d'un mode CVT ?
- : réduction du blanking ?
- : profondeur de couleur
@<refresh>
: vitesse de rafraîchissement- : entrelacé (mode non-CVT)
- : marges ?
e
: sortie forcée active- : sortie forcée à l'arrêt
- : 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 à 1024x768 à 85 Hz et à ê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 :
Désactiver modesetting
Vous pouvez vouloir désactiver KMS pour diverses raisons. Pour désactiver KMS, ajoutez comme paramètre du noyau. Consultez Kernel parameters pour plus d'informations.
En plus du paramètre du noyau , pour les cartes graphiques Intel, vous devez ajouter 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 ).