Kernel mode setting (Français)

État de la traduction:
Cet article est la version francophone de
Kernel mode setting
. Date de la dernière traduction: 2022-10-06. Vous pouvez aider à synchroniser la traduction s'il y a eu des
changements
dans la version anglaise.
Related articles
ATI (Français)
Intel graphics (Français)
Nouveau (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.
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.
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 :
amdgpu
pour
AMDGPU
, ou
radeon
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
[
broken link
: package not found]
. 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
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
[
broken link
: invalid section]
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
https://docs.kernel.org/fb/modedb.html
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/gpu/drm/drm_fb_helper.c
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.