https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/508/diffs From 4b6fce5975c2f931a0478cf4deeec97529b05eb6 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Tue, 8 Sep 2020 10:01:55 +0200 Subject: [PATCH 1/3] Revert "linux: Fix platform device probe for DT-based PCI" This reverts commit 249a12c54a9316b089bd22683c011519348496df. https://gitlab.freedesktop.org/xorg/xserver/-/issues/1068 --- config/udev.c | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) --- config/udev.c +++ config/udev.c @@ -464,31 +464,6 @@ config_udev_fini(void) #ifdef CONFIG_UDEV_KMS -/* Find the last occurrence of the needle in haystack */ -static char *strrstr(const char *haystack, const char *needle) -{ - char *prev, *last, *tmp; - - prev = strstr(haystack, needle); - if (!prev) - return NULL; - - last = prev; - tmp = prev + 1; - - while (tmp) { - last = strstr(tmp, needle); - if (!last) - return prev; - else { - prev = last; - tmp = prev + 1; - } - } - - return last; -} - static void config_udev_odev_setup_attribs(struct udev_device *udev_device, const char *path, const char *syspath, int major, int minor, @@ -503,7 +478,7 @@ config_udev_odev_setup_attribs(struct udev_device *udev_device, const char *path attribs->minor = minor; value = udev_device_get_property_value(udev_device, "ID_PATH"); - if (value && (str = strrstr(value, "pci-"))) { + if (value && (str = strstr(value, "pci-"))) { attribs->busid = XNFstrdup(str); attribs->busid[3] = ':'; } -- GitLab From 39cb95e959fab97a7e255dda1a1599b096fb0f7e Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Tue, 8 Sep 2020 10:03:11 +0200 Subject: [PATCH 2/3] Revert "linux: Fix platform device PCI detection for complex bus topologies" This reverts commit 5c96eb5f44e62a4cfe835023cde304eb5795b8fd. https://gitlab.freedesktop.org/xorg/xserver/-/issues/1068 --- config/udev.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) --- config/udev.c +++ config/udev.c @@ -470,7 +470,7 @@ config_udev_odev_setup_attribs(struct udev_device *udev_device, const char *path config_odev_probe_proc_ptr probe_callback) { struct OdevAttributes *attribs = config_odev_allocate_attributes(); - const char *value, *str; + const char *value; attribs->path = XNFstrdup(path); attribs->syspath = XNFstrdup(syspath); @@ -478,8 +478,8 @@ config_udev_odev_setup_attribs(struct udev_device *udev_device, const char *path attribs->minor = minor; value = udev_device_get_property_value(udev_device, "ID_PATH"); - if (value && (str = strstr(value, "pci-"))) { - attribs->busid = XNFstrdup(str); + if (value && !strncmp(value, "pci-", 4)) { + attribs->busid = XNFstrdup(value); attribs->busid[3] = ':'; } -- GitLab From af4c84ce8855e84c0ad89b929bc972e884f0b8e3 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Tue, 8 Sep 2020 10:03:33 +0200 Subject: [PATCH 3/3] Revert "linux: Make platform device probe less fragile" This reverts commit 74b7427c41b4e4104af7abf70a996c086d3d7628. https://gitlab.freedesktop.org/xorg/xserver/-/issues/1068 --- config/udev.c | 17 +++++------------ hw/xfree86/os-support/linux/lnx_platform.c | 20 ++++++++++++++++++-- 2 files changed, 23 insertions(+), 14 deletions(-) --- config/udev.c +++ config/udev.c @@ -56,7 +56,7 @@ static struct udev_monitor *udev_monitor; #ifdef CONFIG_UDEV_KMS static void -config_udev_odev_setup_attribs(struct udev_device *udev_device, const char *path, const char *syspath, +config_udev_odev_setup_attribs(const char *path, const char *syspath, int major, int minor, config_odev_probe_proc_ptr probe_callback); #endif @@ -128,7 +128,7 @@ device_added(struct udev_device *udev_device) LogMessage(X_INFO, "config/udev: Adding drm device (%s)\n", path); - config_udev_odev_setup_attribs(udev_device, path, syspath, major(devnum), + config_udev_odev_setup_attribs(path, syspath, major(devnum), minor(devnum), NewGPUDeviceRequest); return; } @@ -322,7 +322,7 @@ device_removed(struct udev_device *device) LogMessage(X_INFO, "config/udev: removing GPU device %s %s\n", syspath, path); - config_udev_odev_setup_attribs(device, path, syspath, major(devnum), + config_udev_odev_setup_attribs(path, syspath, major(devnum), minor(devnum), DeleteGPUDeviceRequest); /* Retry vtenter after a drm node removal */ systemd_logind_vtenter(); @@ -465,24 +465,17 @@ config_udev_fini(void) #ifdef CONFIG_UDEV_KMS static void -config_udev_odev_setup_attribs(struct udev_device *udev_device, const char *path, const char *syspath, +config_udev_odev_setup_attribs(const char *path, const char *syspath, int major, int minor, config_odev_probe_proc_ptr probe_callback) { struct OdevAttributes *attribs = config_odev_allocate_attributes(); - const char *value; attribs->path = XNFstrdup(path); attribs->syspath = XNFstrdup(syspath); attribs->major = major; attribs->minor = minor; - value = udev_device_get_property_value(udev_device, "ID_PATH"); - if (value && !strncmp(value, "pci-", 4)) { - attribs->busid = XNFstrdup(value); - attribs->busid[3] = ':'; - } - /* ownership of attribs is passed to probe layer */ probe_callback(attribs); } @@ -523,7 +516,7 @@ config_udev_odev_probe(config_odev_probe_proc_ptr probe_callback) else if (!check_seat(udev_device)) goto no_probe; - config_udev_odev_setup_attribs(udev_device, path, syspath, major(devnum), + config_udev_odev_setup_attribs(path, syspath, major(devnum), minor(devnum), probe_callback); no_probe: udev_device_unref(udev_device); --- hw/xfree86/os-support/linux/lnx_platform.c +++ hw/xfree86/os-support/linux/lnx_platform.c @@ -23,13 +23,13 @@ static Bool get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index) { + drmSetVersion sv; drmVersionPtr v; + char *buf; int fd; int err = 0; Bool paused, server_fd = FALSE; - LogMessage(X_INFO, "Platform probe for %s\n", attribs->syspath); - fd = systemd_logind_take_fd(attribs->major, attribs->minor, path, &paused); if (fd != -1) { if (paused) { @@ -48,6 +48,18 @@ get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index) if (fd == -1) return FALSE; + sv.drm_di_major = 1; + sv.drm_di_minor = 4; + sv.drm_dd_major = -1; /* Don't care */ + sv.drm_dd_minor = -1; /* Don't care */ + + err = drmSetInterfaceVersion(fd, &sv); + if (err) { + xf86Msg(X_ERROR, "%s: failed to set DRM interface version 1.4: %s\n", + path, strerror(-err)); + goto out; + } + /* for a delayed probe we've already added the device */ if (delayed_index == -1) { xf86_add_platform_device(attribs, FALSE); @@ -57,6 +69,10 @@ get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index) if (server_fd) xf86_platform_devices[delayed_index].flags |= XF86_PDEV_SERVER_FD; + buf = drmGetBusid(fd); + xf86_platform_odev_attributes(delayed_index)->busid = XNFstrdup(buf); + drmFreeBusid(buf); + v = drmGetVersion(fd); if (!v) { xf86Msg(X_ERROR, "%s: failed to query DRM version\n", path); -- GitLab