Jump to content
From ArchWiki
É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.
- 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 :

- `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. 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 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.
Categories:

- Graphics (Français)
- Kernel (Français)