From c0b2e69f8815881d51b68b4f73e6c7f8cc2417a1 Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Thu, 1 Jul 2021 12:30:29 +0200 Subject: [PATCH 1/3] login: XGI Z7/Z9 (XG20 core) graphic chip requires master-of-seat to be set This graphic chip doesn't have a DRM driver and fall back to vesa-framebuffer driver. Without this patch, users of such chip suddenly see their GUI broken without any indication or reason of what happened (no error message). Hence this regression is near to impossible to troubleshoot for end users. Such case was reported https://bugzilla.opensuse.org/show_bug.cgi?id=1187154. Rather than adding another exception in the udev rules to deal with such HWs, they instead get their own hwdb file '60-seat.hwdb'. --- hwdb.d/60-seat.hwdb | 20 ++++++++++++++++++++ hwdb.d/meson.build | 1 + hwdb.d/parse_hwdb.py | 2 ++ src/login/71-seat.rules.in | 5 +++++ 4 files changed, 28 insertions(+) create mode 100644 hwdb.d/60-seat.hwdb diff --git a/hwdb.d/60-seat.hwdb b/hwdb.d/60-seat.hwdb new file mode 100644 index 00000000000..d280040c8a3 --- /dev/null +++ b/hwdb.d/60-seat.hwdb @@ -0,0 +1,20 @@ +# This file is part of systemd. +# +# This file lists graphic devices that don't have a DRM driver and fall back to +# a frame-buffer one instead. Since commit 6260d28b8a, frame-buffer devices are +# no more considered as graphical capable. +# +# The matches have the 'fb' prefix to make sure that only the framebuffer +# device, and not the (parent) PCI device, is tagged with 'master-of-seat'. +# +# Allowed properties are: +# ID_TAG_MASTER_OF_SEAT=1 + +######################################### +# eXtreme Graphic Innovation (XGI) +######################################### + +# Z7/Z9 (XG20 core), a rather ancient graphic chip, doesn't have a DRM driver +# and falls back to vesafb. +fb:pci:v000018CAd00000020* + ID_TAG_MASTER_OF_SEAT=1 diff --git a/hwdb.d/meson.build b/hwdb.d/meson.build index fd8c15a521d..0a96b5553a5 100644 --- a/hwdb.d/meson.build +++ b/hwdb.d/meson.build @@ -25,6 +25,7 @@ hwdb_files_test = files(''' 60-evdev.hwdb 60-input-id.hwdb 60-keyboard.hwdb + 60-seat.hwdb 60-sensor.hwdb 70-joystick.hwdb 70-mouse.hwdb diff --git a/hwdb.d/parse_hwdb.py b/hwdb.d/parse_hwdb.py index 6d88766f0b2..3cd4b486a6b 100755 --- a/hwdb.d/parse_hwdb.py +++ b/hwdb.d/parse_hwdb.py @@ -67,6 +67,7 @@ UDEV_TAG = Word(string.ascii_uppercase, alphanums + '_') # Those patterns are used in type-specific matches TYPES = {'mouse': ('usb', 'bluetooth', 'ps2', '*'), 'evdev': ('name', 'atkbd', 'input'), + 'fb': ('pci'), 'id-input': ('modalias'), 'touchpad': ('i8042', 'rmi', 'bluetooth', 'usb'), 'joystick': ('i8042', 'rmi', 'bluetooth', 'usb'), @@ -163,6 +164,7 @@ def property_grammar(): ('IEEE1394_UNIT_FUNCTION_VIDEO', Or((Literal('0'), Literal('1')))), ('ID_VENDOR_FROM_DATABASE', name_literal), ('ID_MODEL_FROM_DATABASE', name_literal), + ('ID_TAG_MASTER_OF_SEAT', Literal('1')), ) fixed_props = [Literal(name)('NAME') - Suppress('=') - val('VALUE') for name, val in props] diff --git a/src/login/71-seat.rules.in b/src/login/71-seat.rules.in index 809467c6c85..0ebbb8efe2e 100644 --- a/src/login/71-seat.rules.in +++ b/src/login/71-seat.rules.in @@ -29,6 +29,11 @@ SUBSYSTEM=="graphics", KERNEL=="fb[0-9]", IMPORT{cmdline}="nomodeset", TAG+="mas SUBSYSTEM=="pci", ENV{ID_PCI_CLASS_FROM_DATABASE}=="Display controller", \ ENV{DRIVER}=="", IMPORT{cmdline}="nomodeset", TAG+="seat", TAG+="master-of-seat" +# Synthesize a seat for graphic devices without DRM and that fall back to fb +# device instead. Such HWs are listed in hwdb. +SUBSYSTEM=="graphics", KERNEL=="fb[0-9]*", ATTRS{modalias}=="?*", IMPORT{builtin}="hwdb fb:$attr{modalias}" +ENV{ID_TAG_MASTER_OF_SEAT}=="1", TAG+="master-of-seat" + SUBSYSTEM=="drm", KERNEL=="card[0-9]*", TAG+="seat", TAG+="master-of-seat" # Allow individual USB ports to be assigned to a seat From 7802260baa551eee208e63c65598436f75ff84ee Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Thu, 1 Jul 2021 21:34:34 +0200 Subject: [PATCH 2/3] login: use a hwdb entry for tagging HyperV's fb devices with 'master-of-seat' tag Graphic devices that don't do DRM and relies on fb devices are now listed in hwdb. Dedicated udev rules are no more needed. --- hwdb.d/60-seat.hwdb | 9 +++++++++ src/login/71-seat.rules.in | 3 --- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/hwdb.d/60-seat.hwdb b/hwdb.d/60-seat.hwdb index d280040c8a3..ed300199010 100644 --- a/hwdb.d/60-seat.hwdb +++ b/hwdb.d/60-seat.hwdb @@ -18,3 +18,12 @@ # and falls back to vesafb. fb:pci:v000018CAd00000020* ID_TAG_MASTER_OF_SEAT=1 + +######################################### +# HyperV +######################################### + +# HyperV currently doesn't do DRM, hence we need to synthesize for HyperV's fb +# device instead. +fb:pci:v00001414d00005353* + ID_TAG_MASTER_OF_SEAT=1 diff --git a/src/login/71-seat.rules.in b/src/login/71-seat.rules.in index 0ebbb8efe2e..923cccdd29a 100644 --- a/src/login/71-seat.rules.in +++ b/src/login/71-seat.rules.in @@ -18,9 +18,6 @@ SUBSYSTEM=="graphics", KERNEL=="fb[0-9]*", TAG+="seat" SUBSYSTEM=="leds", TAG+="seat" SUBSYSTEM=="backlight", TAG+="seat" -# HyperV currently doesn't do DRM, hence we need to synthesize for HyperV's fb device instead -SUBSYSTEM=="graphics", KERNEL=="fb[0-9]", DRIVERS=="hyperv_fb", TAG+="master-of-seat" - # Allow efifb / uvesafb to be a master if KMS is disabled SUBSYSTEM=="graphics", KERNEL=="fb[0-9]", IMPORT{cmdline}="nomodeset", TAG+="master-of-seat" From f1232f5e38ce9dce21530f5b74eb4dd8780a0aa3 Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Fri, 2 Jul 2021 14:43:50 +0200 Subject: [PATCH 3/3] login: use a hwdb entry for tagging Parallels' fb devices with 'master-of-seat' tag This assumes that (vesa)fb driver is used as fallback. --- hwdb.d/60-seat.hwdb | 7 +++++++ src/login/71-seat.rules.in | 5 ----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/hwdb.d/60-seat.hwdb b/hwdb.d/60-seat.hwdb index ed300199010..fcb8f53cd1e 100644 --- a/hwdb.d/60-seat.hwdb +++ b/hwdb.d/60-seat.hwdb @@ -27,3 +27,10 @@ fb:pci:v000018CAd00000020* # device instead. fb:pci:v00001414d00005353* ID_TAG_MASTER_OF_SEAT=1 + +######################################### +# Parallels +######################################### + +fb:pci:v00001ab8d00004005* + ID_TAG_MASTER_OF_SEAT=1 diff --git a/src/login/71-seat.rules.in b/src/login/71-seat.rules.in index 923cccdd29a..25e4ee7e589 100644 --- a/src/login/71-seat.rules.in +++ b/src/login/71-seat.rules.in @@ -47,11 +47,6 @@ SUBSYSTEM=="usb", ATTR{idVendor}=="2230", ATTR{idProduct}=="000[13]", ENV{ID_AUT # http://git.qemu.org/?p=qemu.git;a=blob;f=docs/multiseat.txt SUBSYSTEM=="pci", ATTR{vendor}=="0x1b36", ATTR{device}=="0x000a", TAG+="seat", ENV{ID_AUTOSEAT}="1" -# Video adapter of Parallels virtualization platform -# Seat should be synthesized for it. But there's no in-kernel driver for this -# device so matching by vid/pid. -SUBSYSTEM=="pci", ATTRS{vendor}=="0x1ab8", ATTRS{device}=="0x4005", TAG+="seat", TAG+="master-of-seat" - # Mimo 720, with integrated USB hub, displaylink graphics, and e2i # touchscreen. This device carries no proper VID/PID in the USB hub, # but it does carry good ID data in the graphics component, hence we