egl_dri2: Use external driver pci list
[mesa.git] / src / egl / drivers / dri2 / common.c
1 #include <stdio.h>
2 #include <string.h>
3
4 #include <libudev.h>
5
6 #include <sys/types.h>
7 #include <sys/stat.h>
8 #include <unistd.h>
9
10 #include "egl_dri2.h"
11 #define DRIVER_MAP_DRI2_ONLY
12 #include "pci_ids/pci_id_driver_map.h"
13
14 static struct udev_device *
15 dri2_udev_device_new_from_fd(struct udev *udev, int fd)
16 {
17 struct udev_device *device;
18 struct stat buf;
19
20 if (fstat(fd, &buf) < 0) {
21 _eglLog(_EGL_WARNING, "EGL-DRI2: failed to stat fd %d", fd);
22 return NULL;
23 }
24
25 device = udev_device_new_from_devnum(udev, 'c', buf.st_rdev);
26 if (device == NULL) {
27 _eglLog(_EGL_WARNING,
28 "EGL-DRI2: could not create udev device for fd %d", fd);
29 return NULL;
30 }
31
32 return device;
33 }
34
35 char *
36 dri2_get_device_name_for_fd(int fd)
37 {
38 struct udev *udev;
39 struct udev_device *device;
40 const char *const_device_name;
41 char *device_name = NULL;
42
43 udev = udev_new();
44 device = dri2_udev_device_new_from_fd(udev, fd);
45 if (device == NULL)
46 return NULL;
47
48 const_device_name = udev_device_get_devnode(device);
49 if (!const_device_name)
50 goto out;
51 device_name = strdup(const_device_name);
52
53 out:
54 udev_device_unref(device);
55 udev_unref(udev);
56
57 return device_name;
58 }
59
60 char *
61 dri2_get_driver_for_fd(int fd)
62 {
63 struct udev *udev;
64 struct udev_device *device, *parent;
65 const char *pci_id;
66 char *driver = NULL;
67 int vendor_id, chip_id, i, j;
68
69 udev = udev_new();
70 device = dri2_udev_device_new_from_fd(udev, fd);
71 if (device == NULL)
72 return NULL;
73
74 parent = udev_device_get_parent(device);
75 if (parent == NULL) {
76 _eglLog(_EGL_WARNING, "DRI2: could not get parent device");
77 goto out;
78 }
79
80 pci_id = udev_device_get_property_value(parent, "PCI_ID");
81 if (pci_id == NULL ||
82 sscanf(pci_id, "%x:%x", &vendor_id, &chip_id) != 2) {
83 _eglLog(_EGL_WARNING, "EGL-DRI2: malformed or no PCI ID");
84 goto out;
85 }
86
87 for (i = 0; driver_map[i].driver; i++) {
88 if (vendor_id != driver_map[i].vendor_id)
89 continue;
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);
94 goto out;
95 }
96
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);
102 goto out;
103 }
104 }
105
106 out:
107 udev_device_unref(device);
108 udev_unref(udev);
109
110 return driver;
111 }