Tested only on OpenBSD. Before: $ cat drm-name.c #include <fcntl.h> #include <stdio.h> #include <xf86drm.h> int main(void) { int fd = open("/dev/dri/renderD128", O_RDONLY); puts(drmGetRenderDeviceNameFromFd(fd)); puts(drmGetPrimaryDeviceNameFromFd(fd)); fd = open("/dev/dri/card0", O_RDONLY); puts(drmGetPrimaryDeviceNameFromFd(fd)); puts(drmGetRenderDeviceNameFromFd(fd)); } $ cc drm-name.c `pkg-config --cflags --libs libdrm` $ ./a.out /dev/dri/renderD256 /dev/dri/card128 /dev/dri/card0 /dev/dri/renderD128 after: $ ./a.out /dev/dri/renderD128 /dev/dri/card0 /dev/dri/card0 /dev/dri/renderD128 Fixes: 293b95e81531 ("xf86drm: open correct render node on non-linux") --- xf86drm.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/xf86drm.c b/xf86drm.c index 22214417..294f8635 100644 --- a/xf86drm.c +++ b/xf86drm.c @@ -3498,6 +3498,8 @@ static char *drmGetMinorNameForFD(int fd, int type) const char *dev_name = drmGetDeviceName(type); unsigned int maj, min; int n; + int base = drmGetMinorBase(type); + int renderbase = drmGetMinorBase(DRM_NODE_RENDER); if (fstat(fd, &sbuf)) return NULL; @@ -3511,7 +3513,10 @@ static char *drmGetMinorNameForFD(int fd, int type) if (!dev_name) return NULL; - n = snprintf(buf, sizeof(buf), dev_name, DRM_DIR_NAME, min); + if (min >= renderbase) + min -= renderbase; + + n = snprintf(buf, sizeof(buf), dev_name, DRM_DIR_NAME, base + min); if (n == -1 || n >= sizeof(buf)) return NULL; -- 2.48.0