41
@@ -437,6 +437,16 @@ config_udev_odev_setup_attribs(const char *path, const char *syspath,
40
#ifdef CONFIG_UDEV_KMS
43
+get_pci_busid(const char *in, char *pci_str)
45
+ int ret, domain, bus, dev, func;
46
+ ret = sscanf(in, "/%04x:%02x:%02x.%d/drm/card%*d", &domain, &bus, &dev, &func);
49
+ sprintf(pci_str, "pci:%04x:%02x:%02x.%d", domain, bus, dev, func);
54
config_udev_odev_setup_attribs(const char *path, const char *syspath,
55
config_odev_probe_proc_ptr probe_callback)
57
struct OdevAttributes *attribs = config_odev_allocate_attribute_list();
59
+ const char *platform;
45
67
+ if (strstr(syspath, "/devices/pci")) {
46
69
+ const char *end = strstr(syspath, "/drm/card");
47
+ if (end && end - 12 > syspath) {
48
+ char pci_str[17] = "pci:";
50
+ strncpy(pci_str + 4, end - 12, 12);
70
+ if (strstr(syspath, "/usb"))
71
+ ret = config_odev_add_attribute(attribs, ODEV_ATTRIB_BUSID, "");
72
+ else if (get_pci_busid(end - 13, pci_str))
51
73
+ ret = config_odev_add_attribute(attribs, ODEV_ATTRIB_BUSID, pci_str);
74
+ } else if ((platform = strstr(syspath, "/devices/platform/"))) {
77
+ end = strchr(platform, '.');
80
+ ret = asprintf(&busid, "platform:%.*s:%02li",
81
+ (int)(end - platform), platform, strtol(end + 1, NULL, 10));
83
+ ret = config_odev_add_attribute(attribs, ODEV_ATTRIB_BUSID, busid);
55
93
/* ownership of attribs is passed to probe layer */
56
94
probe_callback(attribs);
58
diff --git a/hw/xfree86/os-support/linux/lnx_platform.c b/hw/xfree86/os-support/linux/lnx_platform.c
59
index 76f5583..11bb9fc 100644
60
96
--- a/hw/xfree86/os-support/linux/lnx_platform.c
61
97
+++ b/hw/xfree86/os-support/linux/lnx_platform.c
64
100
#include "hotplug.h"
67
103
-get_drm_info(struct OdevAttributes *attribs, char *path)
73
- fd = open(path, O_RDWR, O_CLOEXEC);
105
+set_drm_info(const char *path)
111
fd = open(path, O_RDWR, O_CLOEXEC);
77
- sv.drm_di_major = 1;
78
- sv.drm_di_minor = 4;
79
- sv.drm_dd_major = -1; /* Don't care */
80
- sv.drm_dd_minor = -1; /* Don't care */
81
- if (drmSetInterfaceVersion(fd, &sv)) {
118
sv.drm_dd_major = -1; /* Don't care */
119
sv.drm_dd_minor = -1; /* Don't care */
120
if (drmSetInterfaceVersion(fd, &sv)) {
82
121
- ErrorF("setversion 1.4 failed\n");
123
+ ErrorF("setversion 1.4 failed on %s: %m\n", path);
86
128
- xf86_add_platform_device(attribs);
88
- buf = drmGetBusid(fd);
89
- xf86_add_platform_device_attrib(xf86_num_platform_devices - 1,
90
- ODEV_ATTRIB_BUSID, buf);
130
buf = drmGetBusid(fd);
132
xf86_add_platform_device_attrib(xf86_num_platform_devices - 1,
133
ODEV_ATTRIB_BUSID, buf);
97
xf86PlatformDeviceCheckBusID(struct xf86_platform_device *device, const char *busid)
99
@@ -119,10 +89,7 @@ xf86PlatformDeviceProbe(struct OdevAttributes *attribs)
142
struct OdevAttribute *attrib;
146
+ const char *path = NULL, *busid = NULL, *syspath = NULL;
148
xorg_list_for_each_entry(attrib, &attribs->list, member) {
149
- if (attrib->attrib_id == ODEV_ATTRIB_PATH) {
150
+ if (attrib->attrib_id == ODEV_ATTRIB_PATH)
151
path = attrib->attrib_name;
154
+ else if (attrib->attrib_id == ODEV_ATTRIB_SYSPATH)
155
+ syspath = attrib->attrib_name;
156
+ else if (attrib->attrib_id == ODEV_ATTRIB_BUSID)
157
+ busid = attrib->attrib_name;
161
@@ -119,10 +118,11 @@
100
162
LogMessage(X_INFO, "config/udev: Adding drm device (%s)\n",
103
+ xf86_add_platform_device(attribs);
104
165
- ret = get_drm_info(attribs, path);
105
166
- if (ret == FALSE)
169
+ xf86_add_platform_device(attribs);
171
+ LogMessage(X_WARNING, "Could not extract busid from syspath %s, attempting drm probe\n", syspath);
172
+ set_drm_info(path);