From: Christian Gmeiner Date: Thu, 9 Aug 2018 05:12:22 +0000 (+0200) Subject: loader: add loader_open_render_node(..) X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=commitdiff_plain;h=ab348885ebbc669f5dec032851147bd64a2d5e26;hp=d0b09e2dfe7e42a542d6430426c584d74a5bd66e 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 --- 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 @@ -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);