From ab348885ebbc669f5dec032851147bd64a2d5e26 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Thu, 9 Aug 2018 07:12:22 +0200 Subject: [PATCH] loader: add loader_open_render_node(..) This helper is almost a 1:1 copy of tegra_open_render_node(). Signed-off-by: Christian Gmeiner Reviewed-by: Emil Velikov --- 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 2e37d11..461f96a 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 3859b45..7b4dd01 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 * -- 2.7.4