LINUX.ORG.RU

Перестал работать PRIME после обновления драйвера

 , , ,


0

1

/etc/X11/xorg.conf

Section "ServerLayout"
    Identifier "layout"
    Screen 0 "nvidia" 0 0
    Inactive "intel"
EndSection

Section "Module"
#    Load "dri2"
    Load "glx"
EndSection

Section "Monitor"
    Identifier "Monitor0"
    VendorName "Unknown"
    ModelName "Unknown"
    Option "DPMS"
EndSection

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID "1:0:0"
    Option "AddARGBGLXVisuals" "true"
EndSection

Section "Screen"
    Identifier "nvidia"
    Device "nvidia"
    Monitor "Monitor0"
    DefaultDepth 24
    Option "UseDisplayDevice" "none"
    SubSection "Display"
        Virtual     1600 900
        Modes "nvidia-auto-select"
    EndSubSection
EndSection

Section "Device"
    Identifier "intel"
    Driver "modesetting"
EndSection

Section "Screen"
    Identifier "intel"
    Device "intel"
    Monitor "Monitor0"
EndSection

/etc/X11/gdm/Init/Default в конце конфига перед exit 0:

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Это полностью рабочий конфиг, который последний раз работал на версии драйвера 410.xx. После 415.xx конфиг перестал работать. Вот что в логах:

[800236.157] (II) modesetting(1): using drv /dev/dri/card0
[800236.158] (EE) Screen 1 deleted because of no matching config section.
[800236.158] (II) UnloadModule: "modesetting"

Получается, что на чипе NVIDIA графика «поднялась», а на чипе Intel графика не поднялась. Это также визуализируется тем, что экран не гаснет, и я вижу символы в VT.

Я подумал, что это в драйвере 415.xx какая-то ошибка, и решил попробовать с более новым 430.xx. Там то же самое. Теперь я попробовал с совсем новым дрйавером 460.xx. Там кое-что изменилось. Во-первых, экран теперь гаснет, что говорит о том, что на чипе Intel что-то запустилось. А вот что в логах:

[804790.387] (II) modesetting(1): using drv /dev/dri/card0
[804790.387] (II) modesetting(G0): using drv /dev/dri/card0
[804790.387] (EE) Screen 1 deleted because of no matching config section.
[804790.387] (II) UnloadModule: "modesetting"

После чего, в конфиге появляется огромное количество сообщений о драйвере modesetting(G0). То, что он нашёл экран, определил его разрешение, и т.д.

Но команда xrandr не пытается пробросить картинку с NVIDIA на Intel. Я запустил gnome-terminal, не видя экран, и попробовал выполнить xrandr --listproviders

Providers: number : 2
Provider 0: id: 0x2b1 cap: 0x0 crtcs: 0 outputs: 0 associated providers: 0 name:NVIDIA-0
Provider 1: id: 0x46 cap: 0x2, Sink Output crtcs: 3 outputs: 4 associated providers: 0 name:modesetting

(кстати, с драйвером 415.xx провайдер был только 1, и это была NVIDIA)

Пытаюсь выполнить команды проброса картинки.

X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  139 (RANDR)
  Minor opcode of failed request:  35 ()
  Value in failed request:  0x2b1
  Serial number of failed request:  16
  Current serial number in output stream:  17

А ещё я попытался сделать скриншот, не видя экрана. Скриншот полуился размером 8x8 точек, и там едва угадывается кусочек панели GNOME.

$ xrandr
Screen 0: minimum 8 x 8, current 8 x 8, maximum 16384 x 16384
$ xrandr -s 1600x900
Size 1600x900 not found in available modes

>>> Логи рабочего драйвера
>>> Логи драйвера 430.xx
>>> Логи драйвера 460.xx

У тебя черезжопные конфиги, причём все. Должно быть как: modesetting(0) – дисплей девайс, NVIDIA(G0) – GPU девайс, оба на screen 0.

В рабочем конфиге у тебя: modesetting(G0) – GPU девайс, NVIDIA(0) – дисплей девайс без выходов. Оба на одном screen 0, благодаря чему оба девайса активны, что даёт с помощью xrandr поменять девайсы ролями, сделать NVIDIA GPU девайсом, а modesetting дисплей девайсом.

В нерабочих конфигах NVIDIA садится на screen 0, modesetting пытается сесть на screen 1, конфигурации для screen 1 нет, он выгружается, получается скрин без выходов.

Тебе надо

Section "ServerLayout"
    # single screen
    Identifier "l0"
    Screen "s0"
EndSection
Section "Screen"
    # bind display device, gpu device, and monitor together
    Identifier "s0"
    Device "d0"
    GPUDevice "d1"
    Monitor "m0"
EndSection
Section "Device"
    # bind driver modesetting to PCI:0:2:0 device
    Identifier "d0"
    Driver "modesetting"
    BusID "0:2:0"
    # bind monotor m0 to device output LVDS-0
    Option "Monitor-LVDS-0" "m0"
EndSection
Section "Device"
    # bind driver nvidia to PCI:1:0:0 device
    Identifier "d1"
    Driver "nvidia"
    BusID "1:0:0"
EndSection
Section "Monitor"
    # just to say that there is monitor
    Identifier "m0"
EndSection

А зачем в нерабочих конфигах ядро загружено с nvidia-drm.modeset=0? Охота на ведьм?

iliyap ★★★★★ ()

А тебе обязательно нужен xorg.conf? Сто лет как устарел он. У меня в /usr/share/X11/xorg.conf.d/10-intel-nvidia-drm-outputclass.conf такое содержимое:

Section "ServerLayout"
    Identifier "layout"
    Option "AllowNVIDIAGPUScreens"
EndSection

Section "OutputClass"
    Identifier "intel"
    MatchDriver "i915"
    Driver "modesetting"
EndSection

Section "OutputClass"
    Identifier "nvidia"
    MatchDriver "nvidia-drm"
    Driver "nvidia"
    Option "AllowEmptyInitialConfiguration"
    ModulePath "/usr/lib/nvidia/xorg"
    ModulePath "/usr/lib/xorg/modules"
EndSection
Никаких больше конфигуряторов. Попробуй удалить вообще свой xorg.conf, всё должно заработать само.

ChekPuk ★★★ ()
Ответ на: комментарий от iliyap

> А зачем в нерабочих конфигах ядро загружено с nvidia-drm.modeset=0? Охота на ведьм?

Забыл убрать. Это я пытался пофиксить другую проблему, ещё несколько лет назад.

Сейчас попробую твой конфиг.

Кстати, придумал, как решить проблему с моим имеющимся конфигом. Нужно просто запустить команду, добавляющую новое разрешение экрана 1600x900, а затем пробросить картинку.

ZenitharChampion ★★★★★ ()
Ответ на: комментарий от iliyap
[835562.371] 
X.Org X Server 1.14.4
Release Date: 2013-10-31
[835562.371] X Protocol Version 11, Revision 0
[835562.371] Build Operating System: Linux 3.16.5-gentoo x86_64 Gentoo
[835562.371] Current Operating System: Linux localhost 4.0.7-gentoo #1 SMP Sat Jul 4 01:09:48 NOVT 2015 x86_64
[835562.371] Kernel command line: BOOT_IMAGE=/boot/kernel-genkernel-x86_64-4.0.7-gentoo root=/dev/sda8 resume=/dev/sda3 nvidia-drm.modeset=0
[835562.371] Build Date: 04 July 2015  01:51:28PM
[835562.371]  
[835562.371] Current version of pixman: 0.30.2
[835562.371] 	Before reporting problems, check http://wiki.x.org
	to make sure that you have the latest version.
[835562.371] Markers: (--) probed, (**) from config file, (==) default setting,
	(++) from command line, (!!) notice, (II) informational,
	(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
[835562.371] (==) Log file: "/var/log/Xorg.0.log", Time: Sat Feb 27 14:45:29 2021
[835562.372] (==) Using config file: "/etc/X11/xorg.conf"
[835562.372] (==) Using system config directory "/usr/share/X11/xorg.conf.d"
[835562.372] Parse error on line 10 of section Screen in file /etc/X11/xorg.conf
	"GPUDevice" is not a valid keyword in this section.
[835562.372] (EE) Problem parsing the config file
[835562.372] (EE) Error parsing the config file
[835562.372] (EE) 
Fatal server error:
[835562.372] (EE) no screens found(EE) 
[835562.372] (EE) 
Please consult the The X.Org Foundation support 
	 at http://wiki.x.org
 for help. 
[835562.372] (EE) Please also check the log file at "/var/log/Xorg.0.log" for additional information.
[835562.372] (EE) 
[835562.372] (EE) Server terminated with error (1). Closing log file.

С твоим конфигом вот так. Ещё и VT повис через несколько секунд после старта «иксов», пришлось ребутаться.

ZenitharChampion ★★★★★ ()

Попробовал nvidia-drm.modeset=1, не помогло.

Сейчас буду смотреть логи .bash_history, чтобы понять, а что это я такое делал, что у меня начало появляться устройство modesetting(G0), чего раньше не было.

ZenitharChampion ★★★★★ ()
Ответ на: комментарий от iliyap

Возможно, в драйвере NVIDIA - ошибка. Регрессия, появившаяся в нём в драйвере версии 415.xx. Из-за которой не появляется устройство modesetting(G0), хотя в предыдущих версиях драйвера оно появлялось.

В результате моих каких-то манипуляций, устройство появилось, но после ребута исчезло.

ZenitharChampion ★★★★★ ()
Ответ на: комментарий от ZenitharChampion

Попробуй автоматическое добавление девайсов и GPU девайсов:

Section "ServerLayout"
    Identifier "l0"
    Option "AllowNVIDIAGPUScreens" "on"
    Option "AutoAddDevices" "on"
    Option "AutoAddGPU" "on"
EndSection
Section "Device"
    Identifier "d0"
    Driver "modesetting"
    BusID "0:2:0"
EndSection
Section "Device"
    Identifier "d1"
    Driver "nvidia"
    BusID "1:0:0"
EndSection
iliyap ★★★★★ ()
Ответ на: комментарий от ChekPuk

Кажется этот господин коллекционер компьютерного хлама. Ноутбук с престарелой гентушечкой и xorg-server-1.14.4 (релиз 2013.11) наверное экспонат того же музея.

iliyap ★★★★★ ()
Ответ на: комментарий от ChekPuk

У меня в /usr/share/X11/xorg.conf.d/10-intel-nvidia-drm-outputclass.conf

Неплохо так, особенно при наличии каталога /etc/X11/xorg.conf.d/, куда и надо пихать system-wide конфиги для своего компа.

Сто лет как устарел он.

И он не устарел, что за глупость. Иксы просто без него могут запускаться и обнаруживать много чего сами, просто с помощью файлов в /etc/X11/xorg.conf.d/ им надо помочь в случае проприетарщины.

zemidius ()
Последнее исправление: zemidius (всего исправлений: 1)
Ответ на: комментарий от zemidius

Нет. в /usr/share/X11/xorg.conf.d/ идут дефолтные, дистрибутивные, устанавливаемые из пакетов. А в /etc/X11/xorg.conf.d/ уже пихают кастомизированые, которые для системы будут предпочтительнее. Посмотри в свой /usr/share/X11/xorg.conf.d/ и удивись.

ChekPuk ★★★ ()
Ответ на: комментарий от zemidius

А xorg.conf сто лет назад был объявлен иксоразрабами устаревшим, но поддерживается исключительно из-за тормознутых проприетастов (энвидии). Хотя даже энвидия уже несколько лет назад объявиля о перезоде на xorg.conf.d.

ChekPuk ★★★ ()
Ответ на: комментарий от ChekPuk

А xorg.conf сто лет назад был объявлен иксоразрабами устаревшим

Ну нет же, откуда такое взялось то. Если у тебя неизменная конфигурация мониторов и устройств ввода (типа того же kiosk), то гораздо предпочтительнее xorg.conf. В остальных случаях, конечно, его отсутствие.

zemidius ()
Ответ на: комментарий от iliyap

Я заспавнил modesetting(G0) как-то по-читерски. С файлом libGL от старого драйвера, оно заспанилось. Потом прибиваю gdm и кладу новый libGL на место. modesetting(G0) спавнится.

В общем, это явно какая-то регрессия. Не знаю с чем связанная, может со старыми «иксами», может со старым ядром. Попробую обновить и то, и другое, ну и по результатам сообщу разработчикам драйвера.

ZenitharChampion ★★★★★ ()
Ответ на: комментарий от zemidius

Вообще, вынужден признать. На странице https://www.x.org/releases/current/doc/man/man5/xorg.conf.5.xhtml он никоим образом не ущемляется. То ли разрабы в конце концов образумились, то ли это написано нде-то ещё. Надо читать релизнотесы.

ChekPuk ★★★ ()
Ответ на: комментарий от ZenitharChampion

У тебя же в первом логе неуспешного запуска написано modesetting(1). Значит девайс был добавлен не в screen 0, а в screen 1. А для screen 1 конфиг отсутствует, и поэтому модуль выгружается. Потому что тебе не нужен screen 0 + screen 1, тебе нужен screen 0 с двумя девайсами modesetting(0) и NVIDIA(G0).

[800236.157] (II) modesetting(1): using drv /dev/dri/card0
[800236.158] (EE) Screen 1 deleted because of no matching config section.
[800236.158] (II) UnloadModule: "modesetting"

Во втором логе неуспешного запуска у тебя написано modesetting(1) и modesetting(G0). Значит девайс был добавлен в screen 1 как дисплей девайс и в screen 0 как GPU девайс. Для screen 1 конфиг отсутствует, поэтому modesetting(1) удалён, но modesetting(G0) остался.

[804790.387] (II) modesetting(1): using drv /dev/dri/card0
[804790.387] (II) modesetting(G0): using drv /dev/dri/card0
[804790.387] (EE) Screen 1 deleted because of no matching config section.
[804790.387] (II) UnloadModule: "modesetting"
...
[804790.622] (II) modesetting(G0): EDID for output LVDS-0
[804790.622] (II) modesetting(G0): Manufacturer: LGD  Model: 365  Serial#: 0
[804790.622] (II) modesetting(G0): Year: 2011  Week: 0
[804790.622] (II) modesetting(G0): EDID Version: 1.4

Надо разобраться, почему modesetting девайс добавляется как GPU девайс, а не как дисплей девайс. Должно быть наоборот, видеоадаптер, который используется биосом, должен добавиться как дисплей (primary) девайс, остальные видеоадаптеры должны добавиться как GPU (secondary) девайсы.

Начни с конфига, в котором есть только Device секции, сначала для драйвера modesetting, затем для драйвера nvidia. Всё остальное сервер должен сделать сам: добавить все девайсы в screen 0, выбрать правильный дисплей девайс.

iliyap ★★★★★ ()
Ответ на: комментарий от iliyap

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

Кстати, я так и не понял, как я всё-таки заспавнил устройство modesetting(G0). После перезагрузки, оно перестало появляться.

ZenitharChampion ★★★★★ ()
Ответ на: комментарий от iliyap

Вот логи с драйвером 410.xx. С последним драйвером, с которым работает. И там тоже modesetting(1) и modesetting(G0). Потом первый удаляется, а второй работает.

А в исходном посте, там логи с драйвером 352.xx. Я этот лог приложил, не заметив, что он старый. И да, там нет никакого modesetting(1), есть только modesetting(G0).

В данный момент я снова заспавнил modesetting(G0) с драйвером 460.xx. Могу запустить gnome-terminal и что-то в нём понабирать. Например glxinfo, чтобы убедиться, что всё работает.

Только пробросить на экран не могу. Судя по выводу xrandr, разрешение экрана - только 8x8.

$ xrandr
Screen 0: minimum 8 x 8, current 8 x 8, maximum 16384 x 16384

Я попробовал запустить скрипт:

xrandr --newmode "1600x900_60.00"  101.70  1600 1648 1680 1830  900 903 908 926 -hsync -vsync
xrandr --addmode LVDS-0 1600x900_60.00
xrandr -s 1600x900
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
sh optimus 2> error.log
X Error of failed request:  BadName (named color or font does not exist)
  Major opcode of failed request:  139 (RANDR)
  Minor opcode of failed request:  16 (RRCreateMode)
  Serial number of failed request:  13
  Current serial number in output stream:  13
xrandr: cannot find output "LVDS-0"
Size 1600x900 not found in available modes
X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  139 (RANDR)
  Minor opcode of failed request:  35 ()
  Value in failed request:  0x2b1
  Serial number of failed request:  16
  Current serial number in output stream:  17
ZenitharChampion ★★★★★ ()
Ответ на: комментарий от ZenitharChampion

Судя по ошибкам вывод LVDS-0 отсутствует. А что говорят xrandr --verbose xrandr --verbose --listproviders?

Сначала надо «перенаправлять» (–setprovideroutputsource), тогда становятся доступны выходы GPU девайса.

А конфига и лога от этого запуска не будет?

iliyap ★★★★★ ()
Ответ на: комментарий от iliyap
$ xrandr --verbose
Screen 0: minimum 8 x 8, current 8 x 8, maximum 16384 x 16384
$ xrandr --verbose --listproviders
Screen 0: minimum 8 x 8, current 8 x 8, maximum 16384 x 16384
$ xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x2b1 cap: 0x0 crtcs: 0 outputs: 0 associated providers: 0 name:NVIDIA-0
Provider 1: id: 0x46 cap: 0x2, Sink Output crtcs: 3 outputs: 4 associated providers: 0 name:modesetting
ZenitharChampion ★★★★★ ()
Ответ на: комментарий от iliyap

Неужели зацепка.

А я тут пытаюсь добавить разрешение экрана 1600x900. Пока не получается, он игнорит.

Section "Screen"
    Identifier "nvidia"
    Device "nvidia"
    Monitor "Monitor0"
#    DefaultDepth 24
#    Option "UseDisplayDevice" "none"
#    SubSection "Display"
#        Virtual     1600 900
#        Modes "nvidia-auto-select"
#    EndSubSection
    Option "UseDisplayDevice" "none"
    Option "AllowEmptyInitialConfiguration" "true"
    Subsection "Display"
    Depth 24
    Modes "1600x900_60"
    Option "MetaModes" "1600x900_60 +0+0"
    Option "DPI" "96x96"
    EndSubSection 
EndSection
ZenitharChampion ★★★★★ ()
Ответ на: комментарий от iliyap

> У провайдера NVIDIA-0 отсутствует capability Source Output

http://us.download.nvidia.com/XFree86/Linux-x86_64/430.14/README/randr14.html

The NVIDIA driver currently only supports the Source Output capability. It does not support render offload and cannot be used as an output sink.

Это в драйвере до появления поддержки PRIME Offload.

ZenitharChampion ★★★★★ ()
Ответ на: комментарий от ZenitharChampion

Нет, я туплю. Даже со старым драйвером 319.xx должно выглядеть вот так:

Providers: number : 2
Provider 0: id: 0x2b5 cap: 0x1, Source Output crtcs: 0 outputs: 0 associated providers: 0 name:NVIDIA-0
Provider 1: id: 0x46 cap: 0x2, Sink Output crtcs: 3 outputs: 4 associated providers: 0 name:modesetting

И по-моему до меня дошло. Проблема не в том, что нет «Source Output». А в том, что устройство modesetting(G0) не появляется для меня начиная с драйвера 415.xx. Я сумел заспавнить его как-то по-читерски, удаляя и устанавливая старый и новый драйвер, и подставляя старый libGL к новому драйверу. Возможно, modesetting(G0) не должен был появиться.

Надо решать первопричину проблемы. Понять, почему после драйвера 415.xx стало так. Пойду почитаю Release Notes.

ZenitharChampion ★★★★★ ()
Последнее исправление: ZenitharChampion (всего исправлений: 4)
Ответ на: комментарий от iliyap

Есть небольшой прогресс.

У меня в драйвере 361.xx перестал работать PRIME. Выяснилось, что модуль ядра nvidia-drm не был загружен в память. Для драйвера 358.xx и более старых, этот модуль не был нужен для PRIME. Начиная с драйвера 361.xx, он нужен для PRIME. Об этом даже писали в Release Notes к драйверу 364.xx.

Добавлен модуль ядра nvidia-drm.ko, предоставляющий поддержку PRIME и KMS

Reworked how the NVIDIA driver registers with the Linux kernel's DRM subsystem for PRIME support. As a result, PRIME support requires Linux kernel version 3.13 or newer (previously, PRIME support required Linux kernel version 3.10 or newer).

NVIDIA's implementation of PRIME requires support for DRM render nodes, a feature first merged in Linux 3.12. However, the feature was not enabled by default until Linux 3.17. To enable it on earlier supported kernels, specify the drm.rnodes=1 kernel boot parameter.

В тот раз, я подгрузил драйвер nvidia-drm, и всё запустилось.

Копаясь с драйвером 460.xx, я обнаружил строчки в логе:

[804790.605] (WW) NVIDIA: No DRM device: Direct render devices found but none could be
[804790.606] (WW) NVIDIA:     used.

Неужели не подгружен драйвер nvidia-drm? Проверяю по lsmod. Действительно не подгружен. Подгружаю. Теперь при старте иксов экран не гаснет, и я по-прежнему вижу VT.

Так вот как я заспавнил modesetting(G0). В процессе жонглирования драйверами, я просто выгрузил драйвер nvidia-drm. И без него спавнится нужное устройство modesetting(G0), но нельзя выполнить проброс изображения, потому что, начиная с драйвера 361.xx, для этого нужен драйвер nvidia-drm. А если подгрузить драйвер nvidia-drm, то не спавнится устройство modesetting(G0). Вернее, оно спавнилось до драйвера 410.xx, а после - перестало.

ZenitharChampion ★★★★★ ()
Последнее исправление: ZenitharChampion (всего исправлений: 5)
Ответ на: комментарий от iliyap

Драйвер 410.xx и ниже: nvidia-drm загружен, устройство modesetting(G0) есть.
Драйвер 415.xx и выше: nvidia-drm загружен, устройства modesetting(G0) нет.
Если выгрузить драйвер nvidia-drm, устройство modesetting(G0) есть, но в этом случае нельзя выполнить проброс. Пробрасывать можно только с драйвером nvidia-drm (начиная с 361.xx)

Как вариант, Bumblebee, если через PRIME не заработает.

ZenitharChampion ★★★★★ ()

Новости

Благодаря информации, полученной от iliyap, я создал баг на форуме NVIDIA. Там у меня попросили поменять кое-что в xorg.conf, а именно переставить местами секции intel и nvidia, чтобы nvidia была ниже. Проблемы это не решило. А мне подтвердили, что это регрессия драйвера при работе со старыми «иксами».

Обновил «иксы» до 1.18.4. Заработало. Теперь буду ждать, когда поправят работу старых «иксов».

ZenitharChampion ★★★★★ ()
Последнее исправление: ZenitharChampion (всего исправлений: 2)