From 0131864b339dc0cc5f23def75e6caa5872c9ed11 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 7 Mar 2022 10:16:39 -0500 Subject: [PATCH 4/4] data: Use latest upstream udev rules This pulls in the latest udev rule from upstream that gives us wayland on nvidia when we can, and disables wayland on nvidia when we should. It also pulls in the latest handling for passthrough gpus. --- data/61-gdm.rules.in | 139 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 135 insertions(+), 4 deletions(-) diff --git a/data/61-gdm.rules.in b/data/61-gdm.rules.in index b1da191f..5dae00ea 100644 --- a/data/61-gdm.rules.in +++ b/data/61-gdm.rules.in @@ -1,6 +1,123 @@ +# identify virtio graphics cards to find passthrough setups +SUBSYSTEM!="virtio", GOTO="gdm_virtio_device_end" +ACTION!="add", GOTO="gdm_virtio_device_end" +ATTR{vendor}=="0x1af4", ATTR{device}=="0x0010", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-virtual-gpu", ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}="1", GOTO="gdm_virtio_device_end" +LABEL="gdm_virtio_device_end" + +SUBSYSTEM!="pci", GOTO="gdm_pci_device_end" +ACTION!="bind", ACTION!="add", GOTO="gdm_pci_device_end" + +# identify virtio graphics cards to find passthrough setups +# cirrus +ATTR{vendor}=="0x1013", ATTR{device}=="0x00b8", ATTR{subsystem_vendor}=="0x1af4", ATTR{subsystem_device}=="0x1100", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-virtual-gpu", ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}="1", GOTO="gdm_pci_device_end" +# vga +ATTR{vendor}=="0x1b36", ATTR{device}=="0x0100", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-virtual-gpu", ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}="1", GOTO="gdm_pci_device_end" +# qxl +ATTR{vendor}=="0x1234", ATTR{device}=="0x1111", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-virtual-gpu", ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}="1", GOTO="gdm_pci_device_end" + # disable Wayland on Hi1710 chipsets -ATTR{vendor}=="0x19e5", ATTR{device}=="0x1711", RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false" -# disable Wayland when using the proprietary nvidia driver -DRIVER=="nvidia", RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false" +ATTR{vendor}=="0x19e5", ATTR{device}=="0x1711", GOTO="gdm_disable_wayland" + +LABEL="gdm_pci_device_end" + # disable Wayland if modesetting is disabled -IMPORT{cmdline}="nomodeset", RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false" +KERNEL!="card[0-9]*", GOTO="gdm_nomodeset_end" +SUBSYSTEM!="drm", GOTO="gdm_nomodeset_end" +IMPORT{parent}="GDM_MACHINE_HAS_VIRTUAL_GPU" +ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}!="1", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-hardware-gpu" +# but keep it enabled for simple framebuffer drivers +DRIVERS=="simple-framebuffer", GOTO="gdm_nomodeset_end" +IMPORT{cmdline}="nomodeset", GOTO="gdm_disable_wayland" +LABEL="gdm_nomodeset_end" + +# The vendor nvidia driver has multiple modules that need to be loaded before GDM can make an +# informed choice on which way to proceed, so force GDM to wait until NVidia's modules are +# loaded before starting up. +KERNEL!="nvidia", GOTO="gdm_nvidia_end" +SUBSYSTEM!="module", GOTO="gdm_nvidia_end" +ACTION!="add", GOTO="gdm_nvidia_end" +RUN+="/usr/bin/touch /run/udev/gdm-machine-has-vendor-nvidia-driver" + +# Check if suspend/resume services necessary for working wayland support is available +TEST{0711}!="/usr/bin/nvidia-sleep.sh", GOTO="gdm_disable_wayland" +TEST{0711}!="/usr/lib/systemd/system-sleep/nvidia", GOTO="gdm_disable_wayland" +IMPORT{program}="/bin/sh -c \"sed -e 's/: /=/g' -e 's/\([^[:upper:]]\)\([[:upper:]]\)/\1_\2/g' -e 's/[[:lower:]]/\U&/g' -e 's/^/NVIDIA_/' /proc/driver/nvidia/params\"" +ENV{NVIDIA_PRESERVE_VIDEO_MEMORY_ALLOCATIONS}!="1", GOTO="gdm_disable_wayland" +IMPORT{program}="/bin/sh -c 'echo NVIDIA_HIBERNATE=`systemctl is-enabled nvidia-hibernate`'" +ENV{NVIDIA_HIBERNATE}!="enabled", GOTO="gdm_disable_wayland" +IMPORT{program}="/bin/sh -c 'echo NVIDIA_RESUME=`systemctl is-enabled nvidia-resume`'" +ENV{NVIDIA_RESUME}!="enabled", GOTO="gdm_disable_wayland" +IMPORT{program}="/bin/sh -c 'echo NVIDIA_SUSPEND=`systemctl is-enabled nvidia-suspend`'" +ENV{NVIDIA_SUSPEND}!="enabled", GOTO="gdm_disable_wayland" +LABEL="gdm_nvidia_end" + +# If this machine has an internal panel, take note, since it's probably a laptop +# FIXME: It could be "ghost connectors" make this pop positive for some workstations +# in the wild. If so, we may have to fallback to looking at the chassis type from +# dmi data or acpi +KERNEL!="card[0-9]-eDP-*", GOTO="gdm_laptop_check_end" +SUBSYSTEM!="drm", GOTO="gdm_laptop_check_end" +ACTION!="add", GOTO="gdm_laptop_check_end" +RUN+="/usr/bin/touch /run/udev/gdm-machine-is-laptop" +GOTO="gdm_hybrid_nvidia_laptop_check" +LABEL="gdm_laptop_check_end" + +# If this is a hybrid graphics setup, take note +KERNEL!="card[1-9]*", GOTO="gdm_hybrid_graphics_check_end" +KERNEL=="card[1-9]-*", GOTO="gdm_hybrid_graphics_check_end" +SUBSYSTEM!="drm", GOTO="gdm_hybrid_graphics_check_end" +ACTION!="add", GOTO="gdm_hybrid_graphics_check_end" +RUN+="/usr/bin/touch /run/udev/gdm-machine-has-hybrid-graphics" +LABEL="gdm_hybrid_graphics_check_end" + +# If this is a hybrid graphics laptop with vendor nvidia driver, disable wayland +LABEL="gdm_hybrid_nvidia_laptop_check" +TEST!="/run/udev/gdm-machine-is-laptop", GOTO="gdm_hybrid_nvidia_laptop_check_end" +TEST!="/run/udev/gdm-machine-has-hybrid-graphics", GOTO="gdm_hybrid_nvidia_laptop_check_end" +TEST!="/run/udev/gdm-machine-has-vendor-nvidia-driver", GOTO="gdm_hybrid_nvidia_laptop_check_end" +GOTO="gdm_disable_wayland" +LABEL="gdm_hybrid_nvidia_laptop_check_end" + +# Disable wayland in situation where we're in a guest with a virtual gpu and host passthrough gpu +LABEL="gdm_virt_passthrough_check" +TEST!="/run/udev/gdm-machine-has-hybrid-graphics", GOTO="gdm_virt_passthrough_check_end" +TEST!="/run/udev/gdm-machine-has-virtual-gpu", GOTO="gdm_virt_passthrough_check_end" +TEST!="/run/udev/gdm-machine-has-hardware-gpu", GOTO="gdm_virt_passthrough_check_end" +GOTO="gdm_disable_wayland" +LABEL="gdm_virt_passthrough_check_end" + +# Disable wayland when there are multiple virtual gpus +LABEL="gdm_virt_multi_gpu_check" +TEST!="/run/udev/gdm-machine-has-hybrid-graphics", GOTO="gdm_virt_multi_gpu_check_end" +TEST!="/run/udev/gdm-machine-has-virtual-gpu", GOTO="gdm_virt_multi_gpu_check_end" +TEST=="/run/udev/gdm-machine-has-hardware-gpu", GOTO="gdm_virt_multi_gpu_check_end" +LABEL="gdm_virt_multi_gpu_check_end" + +# Disable wayland when nvidia modeset is disabled or when drivers are a lower +# version than 470, +# For versions above 470 but lower than 510 prefer Xorg, +# Above 510, prefer Wayland. +KERNEL!="nvidia_drm", GOTO="gdm_nvidia_drm_end" +SUBSYSTEM!="module", GOTO="gdm_nvidia_drm_end" +ACTION!="add", GOTO="gdm_nvidia_drm_end" +# disable wayland if nvidia-drm modeset is not enabled +ATTR{parameters/modeset}!="Y", GOTO="gdm_disable_wayland" +# disable wayland for nvidia drivers versions lower than 470 +ATTR{version}=="4[0-6][0-9].*|[0-3][0-9][0-9].*|[0-9][0-9].*|[0-9].*", GOTO="gdm_disable_wayland" +# For nvidia drivers versions Above 510, keep Wayland by default +ATTR{version}=="[5-9][1-9][0-9].*", GOTO="gdm_end" +# For nvidia drivers versions 470-495, prefer Xorg by default +GOTO="gdm_prefer_xorg" +LABEL="gdm_nvidia_drm_end" + +GOTO="gdm_end" + +LABEL="gdm_prefer_xorg" +RUN+="@libexecdir@/gdm-runtime-config set daemon PreferredDisplayServer xorg" +GOTO="gdm_end" + +LABEL="gdm_disable_wayland" +RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false" +GOTO="gdm_end" + +LABEL="gdm_end" -- 2.34.1