11 #define DRIVER_MAP_DRI2_ONLY
12 #include "pci_ids/pci_id_driver_map.h"
14 static struct udev_device
*
15 dri2_udev_device_new_from_fd(struct udev
*udev
, int fd
)
17 struct udev_device
*device
;
20 if (fstat(fd
, &buf
) < 0) {
21 _eglLog(_EGL_WARNING
, "EGL-DRI2: failed to stat fd %d", fd
);
25 device
= udev_device_new_from_devnum(udev
, 'c', buf
.st_rdev
);
28 "EGL-DRI2: could not create udev device for fd %d", fd
);
36 dri2_get_device_name_for_fd(int fd
)
39 struct udev_device
*device
;
40 const char *const_device_name
;
41 char *device_name
= NULL
;
44 device
= dri2_udev_device_new_from_fd(udev
, fd
);
48 const_device_name
= udev_device_get_devnode(device
);
49 if (!const_device_name
)
51 device_name
= strdup(const_device_name
);
54 udev_device_unref(device
);
61 dri2_get_driver_for_fd(int fd
)
64 struct udev_device
*device
, *parent
;
67 int vendor_id
, chip_id
, i
, j
;
70 device
= dri2_udev_device_new_from_fd(udev
, fd
);
74 parent
= udev_device_get_parent(device
);
76 _eglLog(_EGL_WARNING
, "DRI2: could not get parent device");
80 pci_id
= udev_device_get_property_value(parent
, "PCI_ID");
82 sscanf(pci_id
, "%x:%x", &vendor_id
, &chip_id
) != 2) {
83 _eglLog(_EGL_WARNING
, "EGL-DRI2: malformed or no PCI ID");
87 for (i
= 0; driver_map
[i
].driver
; i
++) {
88 if (vendor_id
!= driver_map
[i
].vendor_id
)
90 if (driver_map
[i
].num_chips_ids
== -1) {
91 driver
= strdup(driver_map
[i
].driver
);
92 _eglLog(_EGL_DEBUG
, "pci id for %d: %04x:%04x, driver %s",
93 fd
, vendor_id
, chip_id
, driver
);
97 for (j
= 0; j
< driver_map
[i
].num_chips_ids
; j
++)
98 if (driver_map
[i
].chip_ids
[j
] == chip_id
) {
99 driver
= strdup(driver_map
[i
].driver
);
100 _eglLog(_EGL_DEBUG
, "pci id for %d: %04x:%04x, driver %s",
101 fd
, vendor_id
, chip_id
, driver
);
107 udev_device_unref(device
);