xf86drm: introduce drmGetDeviceNameFromFd2
The original version considered only card devices, while this will pick the device/node name regardless - card, control, renderD, other... Current implementation is "linux" specific, in such that it relies on sysfs/uevent file. At the same time this gives us the flexibility to support any nodes even future ones, as long as they're within DRM_MAJOR. Shamelessly copied from mesa, latter by: Gary Wong <gtw@gnu.org> Signed-off-by: Emil Velikov <emil.velikov@collabora.com> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>main
parent
7e0bc3bf1c
commit
37d790f7d4
51
xf86drm.c
51
xf86drm.c
|
@ -3303,3 +3303,54 @@ free_locals:
|
||||||
free(local_devices);
|
free(local_devices);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *drmGetDeviceNameFromFd2(int fd)
|
||||||
|
{
|
||||||
|
#ifdef __linux__
|
||||||
|
struct stat sbuf;
|
||||||
|
char *device_name = NULL;
|
||||||
|
unsigned int maj, min;
|
||||||
|
FILE *f;
|
||||||
|
char buf[512];
|
||||||
|
static const char match[9] = "\nDEVNAME=";
|
||||||
|
int expected = 1;
|
||||||
|
|
||||||
|
|
||||||
|
if (fstat(fd, &sbuf))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
maj = major(sbuf.st_rdev);
|
||||||
|
min = minor(sbuf.st_rdev);
|
||||||
|
|
||||||
|
if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
snprintf(buf, sizeof(buf), "/sys/dev/char/%d:%d/uevent", maj, min);
|
||||||
|
if (!(f = fopen(buf, "r")))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
while (expected < sizeof(match)) {
|
||||||
|
int c = getc(f);
|
||||||
|
|
||||||
|
if (c == EOF) {
|
||||||
|
fclose(f);
|
||||||
|
return NULL;
|
||||||
|
} else if (c == match[expected] )
|
||||||
|
expected++;
|
||||||
|
else
|
||||||
|
expected = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(buf, "/dev/");
|
||||||
|
if (fgets(buf + 5, sizeof(buf) - 5, f)) {
|
||||||
|
buf[strcspn(buf, "\n")] = '\0';
|
||||||
|
device_name = strdup(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
return device_name;
|
||||||
|
#else
|
||||||
|
#warning "Missing implementation of drmGetDeviceNameFromFd2"
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
|
@ -753,6 +753,11 @@ typedef struct _drmEventContext {
|
||||||
extern int drmHandleEvent(int fd, drmEventContextPtr evctx);
|
extern int drmHandleEvent(int fd, drmEventContextPtr evctx);
|
||||||
|
|
||||||
extern char *drmGetDeviceNameFromFd(int fd);
|
extern char *drmGetDeviceNameFromFd(int fd);
|
||||||
|
|
||||||
|
/* Improved version of drmGetDeviceNameFromFd which attributes for any type of
|
||||||
|
* device/node - card, control or renderD.
|
||||||
|
*/
|
||||||
|
extern char *drmGetDeviceNameFromFd2(int fd);
|
||||||
extern int drmGetNodeTypeFromFd(int fd);
|
extern int drmGetNodeTypeFromFd(int fd);
|
||||||
|
|
||||||
extern int drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, int *prime_fd);
|
extern int drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, int *prime_fd);
|
||||||
|
|
Loading…
Reference in New Issue