loader: add loader_open_render_node(..)
authorChristian Gmeiner <christian.gmeiner@gmail.com>
Thu, 9 Aug 2018 05:12:22 +0000 (07:12 +0200)
committerChristian Gmeiner <christian.gmeiner@gmail.com>
Fri, 31 Aug 2018 19:46:03 +0000 (21:46 +0200)
This helper is almost a 1:1 copy of tegra_open_render_node().

Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
src/loader/loader.c
src/loader/loader.h

index 2e37d113b8de04601318449e47e451d73090bc09..461f96aa6a448272dedd154fc6c9045ddbb83b7c 100644 (file)
@@ -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;
index 3859b45dc44770d8883f59a1dee35aec74d6011a..7b4dd01144f8cc36d66ec1e5fac317256880a1e8 100644 (file)
@@ -38,6 +38,9 @@ extern "C" {
 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);