Kernel mode setting (Français)

From ArchWiki
État de la traduction: Cet article est la version francophone de Kernel mode setting. Date de la dernière traduction: 2022-04-30. Vous pouvez aider à synchroniser la traduction s'il y a eu des changements dans la version anglaise.

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.

Note: Le pilote propriétaire NVIDIA (depuis 364.12) implémente également KMS, mais il n'utilise pas l'implémentation intégrée du noyau et il lui manque un pilote fbdev pour la console haute résolution

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

Astuce: Si vous rencontrez des problèmes de résolution, vous pouvez vérifier si Forcer les modes aide.

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 :

  • 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 pour std avec qemu et vga/bochs avec libvirt,
    • virtio-gpu pour virtio,
    • qxl pour qxl,
    • vmwgfx pour vmware avec qemu et vmvga pour libvirt,
    • cirrus pour cirrus.
  • 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 ...)
Note: Les utilisateurs d'Intel peuvent avoir besoin d'ajouter 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

Attention: La méthode décrite ci-dessous est en quelque sorte incomplète car, par exemple, Xorg ne prend pas en compte la résolution spécifiée, les utilisateurs sont donc encouragés à utiliser la méthode décrite ci-dessus. Cependant, spécifier la résolution avec la ligne de commande 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ésolution
  • M : calcul d'un mode CVT ?
  • R : réduction du blanking ?
  • -<bpp> : profondeur de couleur
  • @<refresh> : vitesse de rafraîchissement
  • i : entrelacé (mode non-CVT)
  • m : marges ?
  • e : sortie forcée active
  • d : sortie forcée à l'arrêt
  • D : 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").

Note: Certains pilotes Xorg ne fonctionneront pas avec KMS désactivé. Consultez la page wiki de votre pilote spécifique pour plus de détails.