This helper is almost a 1:1 copy of tegra_open_render_node(). Signed-off-by: Christian Gmeiner <christian.gmei...@gmail.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 43275484cc..60b5d71083 100644 --- a/src/loader/loader.c +++ b/src/loader/loader.c @@ -83,6 +83,65 @@ loader_open_device(const char *device_name) } #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 @@ -262,6 +321,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 @@ -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); -- 2.17.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev