Jump to content
From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Kernel mode setting. Дата последней синхронизации: 9 февраля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ссылки по теме

- ATI (Русский)
- Intel graphics (Русский)
- Nouveau (Русский)

Kernel Mode Setting (KMS) представляет собой метод для задания разрешения дисплея и глубины в пространстве ядра, а не в пространстве пользователя.

Реализация KMS в ядре Linux активирует родное расширение в framebuffer и допускает мгновенное переключение консолей (tty). KMS содержит новые технологии (такие как DRI2) которые помогают снизить количество артефактов и увеличить производительность в 3D, даже при включенном режиме энергосбережения.

Примечание: Проприетарный драйвер NVIDIA (с версии 364.12) также поддерживает KMS, но не использует встроенную реализацию ядра и не обеспечивает работу драйвера FBdev для отображения консоли с высоким разрешением.

## История

Ранее настройками видео карты занимался непосредственно X сервер. По этой причине достигнуть высокого качества графики в tty консолях было непросто. Кроме того, каждый раз при переключении из X в виртуальную консоль с помощью комбинации клавиш (`Ctrl+Alt+F1`) сервер должен был передавать управление видеокартой ядру, что было медленным и вызывало мерцания. Особенно "болезненным" был переход управления обратно к X серверу (`Ctrl+Alt+F7`).

С использованием Kernel Mode Setting (KMS) ядру стала доступна установка режимов видео карты. Наряду с другими достоинствами это улучшает визуальные эффекты при установке параметров графики, а также позволяет быстрее переключаться между виртуальными консолями и X.

## Установка

Обратите внимание - для любых используемых Вами методов необходимо всегда отключать:

- Любые `vga=` режимы в загрузчике, так как это вызовет конфликт с разрешением, активированным в KMS.
- Любые `video=` строки, активирующие framebuffer, что вызовет конфликт с драйвером.
- Любые другие драйвера framebuffer (такие как uvesafb).

### Поздний запуск KMS

Драйвера Intel, Nouveau и ATI и AMDGPU уже активируют KMS автоматически для всех чипсетов и не требуют ручной настройки.

Проприетарный драйвер NVIDIA поддерживает KMS с версии 364.12, но нужно включить его вручную.

### Ранний запуск KMS

Совет: В случае проблем с разрешением проверьте, помогает ли принудительный режим.

Обычно KMS инициализируется после этапа initramfs. Однако можно включить KMS уже на этапе initramfs. Добавьте нужный модуль для видеодрайвера в конфигурационный файл initramfs:

- `amdgpu` для AMDGPU ли `radeon` для старого драйвера ATI.
- `i915` для Intel graphics.
- `nouveau` для открытого драйвера Nouveau.
- `mgag200` для Matrox.
- Для QEMU в зависимости от используемого режима графики: `virtio-gpu` для VirtIO, `qxl` для QXL или `cirrus` для Cirrus.
- `nvidia nvidia_modeset nvidia_uvm nvidia_drm` для проприетарного драйвера nvidia. Смотрите NVIDIA (Русский)#DRM kernel mode setting для подробностей.

Инструкции по настройке initramfs немного отличаются в зависимости от генератора initramfs, который вы используете.

#### mkinitcpio

Пример раннего запуска KMS для Intel graphics:

    /etc/mkinitcpio.conf

    MODULES=(... i915 ...)

Примечание: Пользователям Intel может понадобиться добавление `intel_agp` перед `i915` для подавления ошибок ACPI. Это может потребоваться для возобновления работы из спящего режима при изменённой конфигурации дисплея. Если вы используете PRIME GPU с Intel IGP в качестве основного GPU и AMD в качестве дискретного, добавление `intel_agp` может привести к проблемам при возобновлении работы из спящего режима (монитор не получает сигнала). Подробнее: [1]

Если Вы используете изменённый файл EDID (не совпадающий с преднастроенными разрешениями), следует встроить его в initramfs:

    /etc/mkinitcpio.conf

    FILES=(/usr/lib/firmware/edid/ваш_edid.bin)

После изменений пересоберите образ initramfs.

#### Booster

Пример настройки Booster:

    /etc/booster.yaml

    modules_force_load: i915

Добавление дополнительных файлов в образ:

    /etc/booster.yaml

    extra_files: /usr/lib/firmware/edid/ваш_edid.bin

После изменений пересоберите образы booster.

## Решение проблем

### Мои шрифты слишком маленькие

В статье Консоль Linux#Шрифты вы можете узнать, как изменить шрифт в консоли на более крупный. Например, шрифт Terminus (terminus-font) доступен в нескольких размерах, в том числе и в большом `ter-132n`.

Или можно отключить modesetting, что приведёт к использованию меньшего разрешения экрана, и шрифты станут выглядеть крупнее.

### Проблемы во время загрузки и dmesg

Опрос подключенных дисплеев на старых системах может быть довольно громоздким. Опрос происходит периодически и может занять несколько сотен миллисекунд в зависимости от оборудования. Это может приводить к заметным задержкам, например, при воспроизведении видео. Такие задержки могут происходить, даже если видео выводится на HDP-выход, но в конфигурации оборудования есть другие выходы, не HDP. Если у вас наблюдаются задержки в выводе изображения на экран каждые 10 секунд, отключение опроса может помочь.

Если выскакивает ошибка с кодом `0x00000010 (2)` во время процесса загрузки (Вы можете получить около 10 строк текста, последняя часть содержит этот код), используйте:

    /etc/modprobe.d/modprobe.conf

    options drm_kms_helper poll=0

## Принудительный режим и EDID

В случае когда Ваш дисплей не отправляет соответствующий EDID или вызывает какие-либо проблемы, Вы будете уведомлены, что родное разрешение автоматически не настроено или не отображается вообще. Ядро пытается отловить проблемы и устанавливает одно из наиболее типичных разрешений.

Если у вас есть EDID-файл для вашего монитора, то вам просто нужно явно указать его (смотрите ниже). Однако чаще всего прямого доступа к нормальному файлу нет, и приходится либо извлекать существующий и исправлять его, либо генерировать новый.

Создание новых бинарных файлов EDID для различных разрешений и конфигураций возможно во время компиляции ядра, следуя документации (также здесь есть краткое руководство). Другие решения подробно описаны в этой статье. Извлечение существующего в большинстве случаев проще, например, если ваш монитор нормально работает под Windows, вам может повезти извлечь EDID из соответствующего драйвера, или есть похожий монитор, который успешно работает с такими же настройками, вы можете использовать `get-edid` из пакета read-edid. Можно также попробовать поискать в `/sys/class/drm/*/edid`.

После подготовки EDID поместите его в подкаталог, например, с названием `edid` в каталоге `/usr/lib/firmware` и скопируйте в него свой бинарный файл.

Для запуска во время загрузки пропишите параметр ядра:

    drm.edid_firmware=edid/your_edid.bin

Для ядер старее 4.13 используется другой параметр:

    drm_kms_helper.edid_firmware=edid/your_edid.bin

Также, можно указать только для заданного дисплея:

    drm.edid_firmware=VGA-1:edid/your_edid.bin

Для преднастроенные разрешений, смотри таблицу имён спецификаций:

Разрешение | Имя спецификации
--- | ---
800x600 | edid/800x600.bin
1024x768 | edid/1024x768.bin
1280x1024 | edid/1280x1024.bin
1600x1200 (ядро 3.10 или новее) | edid/1600x1200.bin
1680x1050 | edid/1680x1050.bin
1920x1080 | edid/1920x1080.bin

Если осуществлён ранний запуск KMS, необходимо включить кастомизированный файл EDID в initramfs иначе возможны проблемы.

Значение параметра `drm.edid_firmware` также может быть изменено после загрузки путём записи в `/sys/module/drm/parameters/edid_firmware`:

    # echo edid/your_edid.bin > /sys/module/drm/parameters/edid_firmware

Это повлияет только на вновь подключенные мониторы; ранее подключенные продолжат использовать старые настройки EDID. Однако для внешних мониторов достаточно переподключить их, чтобы новый EDID применился.

Начиная с ядра 3.15, для изменения EDID после загрузки системы можно использовать debugfs вместо параметра ядра, если ядро не находится в Lockdown-режиме. Это очень полезно, если вы меняете местами мониторы на разъёме или просто для тестирования.

    # cat correct-edid.bin > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override

Отключение:

    # echo -n reset > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override

Важно: Метод описанный ниже немного не завершён потому что Xorg не принимает заданные разрешения, так что советуем использовать метод, описанный выше; однако, указание разрешения с помощью строки `video=` может оказаться полезным в некоторых событиях.

Взято из nouveau wiki:

  Режим может быть принудительным в командной строке ядра. К сожалению, опция командной строки видео бедно документирована в случае с DRM. Части и куски того как это использовать можно найти в
  - 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

В формате:

    video=<conn>:<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]

- `<conn>`: Коннектор, т.н. DVI-I-1, смотри доступные здесь `/sys/class/drm/`
- `<xres> x <yres>`: разрешение
- `M`: посчитать режим CVT?
- `R`: снижение мерцания?
- `-<bpp>`: глубина цвета
- `@<refresh>`: частота обновления
- `i`: чересстрочный (non-CVT mode)
- `m`: поля?
- `e`: принудительный вывод on
- `d`: принудительный вывод off
- `D`: принудительный цифровой вывод on (т.н. DVI-I коннектор)

Вы можете переопределять режимы нескольких выходов использующих "video" несколько раз, в частности, для вывода DVI в 1024x768 на 85 Hz и отключения TV-out:

    video=DVI-I-1:1024x768@85 video=TV-1:d

Для получения имени и текущего статуса коннекторов, Вы можете использовать однострочную команду:

    $ 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

## Отключение modesetting

Вы можете захотеть отключить KMS по различным причинам. Для отключения KMS добавьте `nomodeset` в параметры ядра.

Наряду с параметром `nomodeset`, для карт Intel необходимо добавить `i915.modeset=0`, а для Nvidia `nouveau.modeset=0`. Для систем двойной графики (dual-graphics system) Nvidia Optimus, нужно добавить все три параметра ядра (`"nomodeset i915.modeset=0 nouveau.modeset=0"`).

Примечание: Некоторые драйвера Xorg не работают с отключенным KMS. Читайте вики-страницу вашего драйвера для подробностей.
Categories:

- Graphics (Русский)
- Kernel (Русский)