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@gmail.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
This commit is contained in:
Christian Gmeiner 2018-08-09 07:12:22 +02:00
parent d0b09e2dfe
commit ab348885eb
2 changed files with 68 additions and 0 deletions

View 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;

View 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);