Mesa (master): loader: add loader_open_render_node(..)

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Aug 31 19:54:51 UTC 2018


Module: Mesa
Branch: master
Commit: ab348885ebbc669f5dec032851147bd64a2d5e26
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ab348885ebbc669f5dec032851147bd64a2d5e26

Author: Christian Gmeiner <christian.gmeiner at gmail.com>
Date:   Thu Aug  9 07:12:22 2018 +0200

loader: add loader_open_render_node(..)

This helper is almost a 1:1 copy of tegra_open_render_node().

Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
Reviewed-by: Emil Velikov <emil.velikov at collabora.com>

---

 src/loader/loader.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/loader/loader.h |  3 +++
 2 files changed, 68 insertions(+)

diff --git a/src/loader/loader.c b/src/loader/loader.c
index 2e37d113b8..461f96aa6a 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 3859b45dc4..7b4dd01144 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 *




More information about the mesa-commit mailing list