summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/loader/loader.c65
-rw-r--r--src/loader/loader.h3
2 files changed, 68 insertions, 0 deletions
diff --git a/src/loader/loader.c b/src/loader/loader.c
index 2e37d113b8d..461f96aa6a4 100644
--- a/src/loader/loader.c
+++ b/src/loader/loader.c
@@ -103,6 +103,65 @@ static char *loader_get_kernel_driver_name(int fd)
}
#if defined(HAVE_LIBDRM)
+int
+loader_open_render_node(const char *name)
+{
+ drmDevicePtr *devices, device;
+ int err, render = -ENOENT, fd;
+ unsigned int num, i;
+
+ err = drmGetDevices2(0, NULL, 0);
+ if (err < 0)
+ return err;
+
+ num = err;
+
+ devices = calloc(num, sizeof(*devices));
+ if (!devices)
+ return -ENOMEM;
+
+ err = drmGetDevices2(0, devices, num);
+ if (err < 0) {
+ render = err;
+ goto free;
+ }
+
+ for (i = 0; i < num; i++) {
+ device = devices[i];
+
+ if ((device->available_nodes & (1 << DRM_NODE_RENDER)) &&
+ (device->bustype == DRM_BUS_PLATFORM)) {
+ drmVersionPtr version;
+
+ fd = open(device->nodes[DRM_NODE_RENDER], O_RDWR | O_CLOEXEC);
+ if (fd < 0)
+ continue;
+
+ version = drmGetVersion(fd);
+ if (!version) {
+ close(fd);
+ continue;
+ }
+
+ if (strcmp(version->name, name) != 0) {
+ drmFreeVersion(version);
+ close(fd);
+ continue;
+ }
+
+ drmFreeVersion(version);
+ render = fd;
+ break;
+ }
+ }
+
+ drmFreeDevices(devices, num);
+
+free:
+ free(devices);
+ return render;
+}
+
#ifdef USE_DRICONF
static const char __driConfigOptionsLoader[] =
DRI_CONF_BEGIN
@@ -306,6 +365,12 @@ int loader_get_user_preferred_fd(int default_fd, bool *different_device)
return default_fd;
}
#else
+int
+loader_open_render_node(const char *name)
+{
+ return -1;
+}
+
int loader_get_user_preferred_fd(int default_fd, bool *different_device)
{
*different_device = false;
diff --git a/src/loader/loader.h b/src/loader/loader.h
index 3859b45dc44..7b4dd01144f 100644
--- a/src/loader/loader.h
+++ b/src/loader/loader.h
@@ -39,6 +39,9 @@ int
loader_open_device(const char *);
int
+loader_open_render_node(const char *name);
+
+int
loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id);
char *