1105 lines
33 KiB
Plaintext
1105 lines
33 KiB
Plaintext
$NetBSD: patch-ab,v 1.8 2015/08/14 17:12:35 wiz Exp $
|
|
|
|
Code for OpenBSD adapted for NetBSD. Assumes NetBSD kernel has been
|
|
patched to use drm ioctl number 0x0f.
|
|
|
|
Patches from FreeBSD ports / DragonFly dports for graphics/libdrm 2.4.84.
|
|
|
|
--- xf86drm.c.orig 2017-12-18 01:33:10.000000000 +0000
|
|
+++ xf86drm.c
|
|
@@ -49,6 +49,9 @@
|
|
#include <signal.h>
|
|
#include <time.h>
|
|
#include <sys/types.h>
|
|
+#ifdef HAVE_SYS_SYSCTL_H
|
|
+#include <sys/sysctl.h>
|
|
+#endif
|
|
#include <sys/stat.h>
|
|
#define stat_t struct stat
|
|
#include <sys/ioctl.h>
|
|
@@ -62,6 +65,10 @@
|
|
#endif
|
|
#include <math.h>
|
|
|
|
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
|
|
+#include <sys/pciio.h>
|
|
+#endif
|
|
+
|
|
/* Not all systems have MAP_FAILED defined */
|
|
#ifndef MAP_FAILED
|
|
#define MAP_FAILED ((void *)-1)
|
|
@@ -72,22 +79,13 @@
|
|
|
|
#include "util_math.h"
|
|
|
|
-#ifdef __OpenBSD__
|
|
-#define DRM_PRIMARY_MINOR_NAME "drm"
|
|
-#define DRM_CONTROL_MINOR_NAME "drmC"
|
|
-#define DRM_RENDER_MINOR_NAME "drmR"
|
|
-#else
|
|
-#define DRM_PRIMARY_MINOR_NAME "card"
|
|
-#define DRM_CONTROL_MINOR_NAME "controlD"
|
|
-#define DRM_RENDER_MINOR_NAME "renderD"
|
|
-#endif
|
|
-
|
|
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
|
|
-#define DRM_MAJOR 145
|
|
+#define DRM_MAJOR 0 /* Major ID unused on systems with devfs */
|
|
#endif
|
|
|
|
#ifdef __NetBSD__
|
|
-#define DRM_MAJOR 34
|
|
+#undef DRM_MAJOR
|
|
+#define DRM_MAJOR 180
|
|
#endif
|
|
|
|
#ifdef __OpenBSD__
|
|
@@ -102,7 +100,7 @@
|
|
#define DRM_MAJOR 226 /* Linux */
|
|
#endif
|
|
|
|
-#ifdef __OpenBSD__
|
|
+#if defined(__OpenBSD__) || defined(__NetBSD__)
|
|
struct drm_pciinfo {
|
|
uint16_t domain;
|
|
uint8_t bus;
|
|
@@ -114,8 +112,12 @@ struct drm_pciinfo {
|
|
uint16_t subdevice_id;
|
|
uint8_t revision_id;
|
|
};
|
|
+#endif
|
|
|
|
+#if defined(__OpenBSD__)
|
|
#define DRM_IOCTL_GET_PCIINFO DRM_IOR(0x15, struct drm_pciinfo)
|
|
+#elif defined(__NetBSD__)
|
|
+#define DRM_IOCTL_GET_PCIINFO DRM_IOR(0x0f, struct drm_pciinfo)
|
|
#endif
|
|
|
|
#define DRM_MSG_VERBOSITY 3
|
|
@@ -180,7 +182,7 @@ void drmFree(void *pt)
|
|
}
|
|
|
|
/**
|
|
- * Call ioctl, restarting if it is interupted
|
|
+ * Call ioctl, restarting if it is interrupted
|
|
*/
|
|
int
|
|
drmIoctl(int fd, unsigned long request, void *arg)
|
|
@@ -189,10 +191,111 @@ drmIoctl(int fd, unsigned long request,
|
|
|
|
do {
|
|
ret = ioctl(fd, request, arg);
|
|
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
|
+/*
|
|
+ * FreeBSD Bug 204174: error code 512 (ERESTARTSYS) leaked from kernel space
|
|
+ * for some older kernels.
|
|
+ */
|
|
+ } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == 512));
|
|
+#else
|
|
} while (ret == -1 && (errno == EINTR || errno == EAGAIN));
|
|
+#endif
|
|
+ if (ret) {
|
|
+ struct stat sbuf;
|
|
+ char name[64];
|
|
+
|
|
+ fstat(fd, &sbuf);
|
|
+ snprintf(name, sizeof(name), "%s", devname(sbuf.st_rdev, S_IFCHR));
|
|
+
|
|
+ drmMsg("[drm] drmIoctl FAILED : fd (%d), device (%s): request (0x%08lx): ret (%d), errno (%d), (%s)\n",
|
|
+ fd, name, request, ret, errno, strerror(errno));
|
|
+ }
|
|
return ret;
|
|
}
|
|
|
|
+static int drmGetMinorBase(int type)
|
|
+{
|
|
+ switch (type) {
|
|
+ case DRM_NODE_PRIMARY:
|
|
+ case DRM_NODE_CONTROL:
|
|
+ case DRM_NODE_RENDER:
|
|
+ return type << 6;
|
|
+ default:
|
|
+ return -1;
|
|
+ };
|
|
+}
|
|
+
|
|
+static int drmGetMinorType(int minor)
|
|
+{
|
|
+ if (minor < 0)
|
|
+ return -1;
|
|
+
|
|
+ int type = minor >> 6;
|
|
+ switch (type) {
|
|
+ case DRM_NODE_PRIMARY:
|
|
+ case DRM_NODE_CONTROL:
|
|
+ case DRM_NODE_RENDER:
|
|
+ return type;
|
|
+ default:
|
|
+ return -1;
|
|
+ }
|
|
+}
|
|
+
|
|
+#if defined(__linux__)
|
|
+static const char *drmGetMinorName(int type)
|
|
+{
|
|
+ switch (type) {
|
|
+ case DRM_NODE_PRIMARY:
|
|
+ return DRM_PRIMARY_MINOR_NAME;
|
|
+ case DRM_NODE_CONTROL:
|
|
+ return DRM_CONTROL_MINOR_NAME;
|
|
+ case DRM_NODE_RENDER:
|
|
+ return DRM_RENDER_MINOR_NAME;
|
|
+ default:
|
|
+ return NULL;
|
|
+ }
|
|
+}
|
|
+#endif
|
|
+
|
|
+static const char *drmGetDeviceName(int type)
|
|
+{
|
|
+ switch (type) {
|
|
+ case DRM_NODE_PRIMARY:
|
|
+ return DRM_DEV_NAME;
|
|
+ case DRM_NODE_CONTROL:
|
|
+ return DRM_CONTROL_DEV_NAME;
|
|
+ case DRM_NODE_RENDER:
|
|
+ return DRM_RENDER_DEV_NAME;
|
|
+ default:
|
|
+ return NULL;
|
|
+ }
|
|
+}
|
|
+
|
|
+static int drmGetNodeNumber(const char *name)
|
|
+{
|
|
+ size_t name_len = strnlen(name, DRM_NODE_NAME_MAX);
|
|
+ while (name_len && isdigit(name[name_len - 1]))
|
|
+ --name_len;
|
|
+ return strtol(name + name_len, NULL, 10);
|
|
+}
|
|
+
|
|
+static int drmGetNodeType(const char *name)
|
|
+{
|
|
+ if (strncmp(name, DRM_PRIMARY_MINOR_NAME,
|
|
+ sizeof(DRM_PRIMARY_MINOR_NAME) - 1) == 0)
|
|
+ return DRM_NODE_PRIMARY;
|
|
+
|
|
+ if (strncmp(name, DRM_CONTROL_MINOR_NAME,
|
|
+ sizeof(DRM_CONTROL_MINOR_NAME ) - 1) == 0)
|
|
+ return DRM_NODE_CONTROL;
|
|
+
|
|
+ if (strncmp(name, DRM_RENDER_MINOR_NAME,
|
|
+ sizeof(DRM_RENDER_MINOR_NAME) - 1) == 0)
|
|
+ return DRM_NODE_RENDER;
|
|
+
|
|
+ return -1;
|
|
+}
|
|
+
|
|
static unsigned long drmGetKeyFromFd(int fd)
|
|
{
|
|
stat_t st;
|
|
@@ -290,7 +393,7 @@ static int drmMatchBusID(const char *id1
|
|
*
|
|
* \internal
|
|
* Checks for failure. If failure was caused by signal call chown again.
|
|
- * If any other failure happened then it will output error mesage using
|
|
+ * If any other failure happened then it will output error message using
|
|
* drmMsg() call.
|
|
*/
|
|
#if !defined(UDEV)
|
|
@@ -327,8 +430,8 @@ static int chown_check_return(const char
|
|
static int drmOpenDevice(dev_t dev, int minor, int type)
|
|
{
|
|
stat_t st;
|
|
- const char *dev_name;
|
|
- char buf[64];
|
|
+ const char *dev_name = drmGetDeviceName(type);
|
|
+ char buf[DRM_NODE_NAME_MAX];
|
|
int fd;
|
|
mode_t devmode = DRM_DEV_MODE, serv_mode;
|
|
gid_t serv_group;
|
|
@@ -338,21 +441,14 @@ static int drmOpenDevice(dev_t dev, int
|
|
gid_t group = DRM_DEV_GID;
|
|
#endif
|
|
|
|
- switch (type) {
|
|
- case DRM_NODE_PRIMARY:
|
|
- dev_name = DRM_DEV_NAME;
|
|
- break;
|
|
- case DRM_NODE_CONTROL:
|
|
- dev_name = DRM_CONTROL_DEV_NAME;
|
|
- break;
|
|
- case DRM_NODE_RENDER:
|
|
- dev_name = DRM_RENDER_DEV_NAME;
|
|
- break;
|
|
- default:
|
|
+ if (!dev_name)
|
|
return -EINVAL;
|
|
- };
|
|
|
|
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
|
|
+ sprintf(buf, dev_name, DRM_DIR_NAME, minor + drmGetMinorBase(type));
|
|
+#else
|
|
sprintf(buf, dev_name, DRM_DIR_NAME, minor);
|
|
+#endif
|
|
drmMsg("drmOpenDevice: node name is %s\n", buf);
|
|
|
|
if (drm_server_info && drm_server_info->get_perms) {
|
|
@@ -456,27 +552,20 @@ wait_for_udev:
|
|
static int drmOpenMinor(int minor, int create, int type)
|
|
{
|
|
int fd;
|
|
- char buf[64];
|
|
- const char *dev_name;
|
|
+ char buf[DRM_NODE_NAME_MAX];
|
|
+ const char *dev_name = drmGetDeviceName(type);
|
|
|
|
if (create)
|
|
return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type);
|
|
|
|
- switch (type) {
|
|
- case DRM_NODE_PRIMARY:
|
|
- dev_name = DRM_DEV_NAME;
|
|
- break;
|
|
- case DRM_NODE_CONTROL:
|
|
- dev_name = DRM_CONTROL_DEV_NAME;
|
|
- break;
|
|
- case DRM_NODE_RENDER:
|
|
- dev_name = DRM_RENDER_DEV_NAME;
|
|
- break;
|
|
- default:
|
|
+ if (!dev_name)
|
|
return -EINVAL;
|
|
- };
|
|
|
|
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
|
|
+ sprintf(buf, dev_name, DRM_DIR_NAME, minor + drmGetMinorBase(type));
|
|
+#else
|
|
sprintf(buf, dev_name, DRM_DIR_NAME, minor);
|
|
+#endif
|
|
if ((fd = open(buf, O_RDWR, 0)) >= 0)
|
|
return fd;
|
|
return -errno;
|
|
@@ -505,11 +594,17 @@ int drmAvailable(void)
|
|
if (!access("/proc/dri/0", R_OK))
|
|
return 1;
|
|
#endif
|
|
+
|
|
+ drmMsg("[drm] drmAvailable: FAILED to open drm minor 0: fd (%d)\n", fd);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
+ drmMsg("[drm] drmAvailable: OPENED drm minor 0 with fd (%d)\n", fd);
|
|
+
|
|
if ((version = drmGetVersion(fd))) {
|
|
retval = 1;
|
|
+ drmMsg("[drm] drmAvailable: SUCCESS to open drm minor 0: fd (%d)\n", fd);
|
|
drmFreeVersion(version);
|
|
}
|
|
close(fd);
|
|
@@ -517,51 +612,6 @@ int drmAvailable(void)
|
|
return retval;
|
|
}
|
|
|
|
-static int drmGetMinorBase(int type)
|
|
-{
|
|
- switch (type) {
|
|
- case DRM_NODE_PRIMARY:
|
|
- return 0;
|
|
- case DRM_NODE_CONTROL:
|
|
- return 64;
|
|
- case DRM_NODE_RENDER:
|
|
- return 128;
|
|
- default:
|
|
- return -1;
|
|
- };
|
|
-}
|
|
-
|
|
-static int drmGetMinorType(int minor)
|
|
-{
|
|
- int type = minor >> 6;
|
|
-
|
|
- if (minor < 0)
|
|
- return -1;
|
|
-
|
|
- switch (type) {
|
|
- case DRM_NODE_PRIMARY:
|
|
- case DRM_NODE_CONTROL:
|
|
- case DRM_NODE_RENDER:
|
|
- return type;
|
|
- default:
|
|
- return -1;
|
|
- }
|
|
-}
|
|
-
|
|
-static const char *drmGetMinorName(int type)
|
|
-{
|
|
- switch (type) {
|
|
- case DRM_NODE_PRIMARY:
|
|
- return DRM_PRIMARY_MINOR_NAME;
|
|
- case DRM_NODE_CONTROL:
|
|
- return DRM_CONTROL_MINOR_NAME;
|
|
- case DRM_NODE_RENDER:
|
|
- return DRM_RENDER_MINOR_NAME;
|
|
- default:
|
|
- return NULL;
|
|
- }
|
|
-}
|
|
-
|
|
/**
|
|
* Open the device by bus ID.
|
|
*
|
|
@@ -2740,50 +2790,80 @@ int drmDropMaster(int fd)
|
|
|
|
char *drmGetDeviceNameFromFd(int fd)
|
|
{
|
|
- char name[128];
|
|
- struct stat sbuf;
|
|
- dev_t d;
|
|
- int i;
|
|
-
|
|
/* The whole drmOpen thing is a fiasco and we need to find a way
|
|
* back to just using open(2). For now, however, lets just make
|
|
* things worse with even more ad hoc directory walking code to
|
|
* discover the device file name. */
|
|
|
|
+ stat_t sbuf;
|
|
fstat(fd, &sbuf);
|
|
- d = sbuf.st_rdev;
|
|
+ dev_t d = sbuf.st_rdev;
|
|
|
|
- for (i = 0; i < DRM_MAX_MINOR; i++) {
|
|
+ drmMsg("[drm] drmGetDeviceNameFromFd: fd (%d)\n", fd);
|
|
+
|
|
+ for (int i = 0; i < DRM_MAX_MINOR; i++) {
|
|
+ char name[DRM_NODE_NAME_MAX];
|
|
snprintf(name, sizeof name, DRM_DEV_NAME, DRM_DIR_NAME, i);
|
|
- if (stat(name, &sbuf) == 0 && sbuf.st_rdev == d)
|
|
- break;
|
|
- }
|
|
- if (i == DRM_MAX_MINOR)
|
|
- return NULL;
|
|
+ if (stat(name, &sbuf) == 0 && sbuf.st_rdev == d) {
|
|
|
|
- return strdup(name);
|
|
+ drmMsg("[drm] drmGetDeviceNameFromFd: device name (%s)\n", name);
|
|
+
|
|
+ return strdup(name);
|
|
+ }
|
|
+ }
|
|
+ return NULL;
|
|
}
|
|
|
|
+
|
|
int drmGetNodeTypeFromFd(int fd)
|
|
{
|
|
- struct stat sbuf;
|
|
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
|
|
+ char *name = drmGetDeviceNameFromFd2(fd);
|
|
+
|
|
+ drmMsg("[drm] drmGetNodeTypeFromFd: fd (%d)\n", fd);
|
|
+
|
|
+ if (!name) {
|
|
+ errno = ENODEV;
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ drmMsg("[drm] drmGetNodeTypeFromFd: device name (%s)\n", name);
|
|
+
|
|
+ int type = drmGetNodeType(name);
|
|
+
|
|
+ drmMsg("[drm] drmGetNodeTypeFromFd: device has type (%d)\n", type);
|
|
+
|
|
+ free(name);
|
|
+ if (type < 0)
|
|
+ errno = ENODEV;
|
|
+ return type;
|
|
+#else
|
|
+ stat_t sbuf;
|
|
int maj, min, type;
|
|
|
|
+ drmMsg("[drm] drmGetNodeTypeFromFd: fd (%d)\n", fd);
|
|
+
|
|
if (fstat(fd, &sbuf))
|
|
return -1;
|
|
|
|
maj = major(sbuf.st_rdev);
|
|
min = minor(sbuf.st_rdev);
|
|
|
|
+ drmMsg("[drm] drmGetNodeTypeFromFd: major (%d), minor (%d)\n", maj, min);
|
|
+
|
|
if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode)) {
|
|
errno = EINVAL;
|
|
return -1;
|
|
}
|
|
|
|
type = drmGetMinorType(min);
|
|
+
|
|
+ drmMsg("[drm] drmGetNodeTypeFromFd: device has type (%d)\n", type);
|
|
+
|
|
if (type == -1)
|
|
errno = ENODEV;
|
|
return type;
|
|
+#endif
|
|
}
|
|
|
|
int drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, int *prime_fd)
|
|
@@ -2823,7 +2903,7 @@ static char *drmGetMinorNameForFD(int fd
|
|
#ifdef __linux__
|
|
DIR *sysdir;
|
|
struct dirent *pent, *ent;
|
|
- struct stat sbuf;
|
|
+ stat_t sbuf;
|
|
const char *name = drmGetMinorName(type);
|
|
int len;
|
|
char dev_name[64], buf[64];
|
|
@@ -2874,13 +2954,44 @@ static char *drmGetMinorNameForFD(int fd
|
|
|
|
out_close_dir:
|
|
closedir(sysdir);
|
|
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
|
|
+ const char *dev_name = drmGetDeviceName(type);
|
|
+ if (!dev_name)
|
|
+ return NULL;
|
|
+
|
|
+ char *name = drmGetDeviceNameFromFd2(fd);
|
|
+ if (!name)
|
|
+ return NULL;
|
|
+
|
|
+ int oldnum = drmGetNodeNumber(name);
|
|
+ int oldtype = drmGetMinorType(oldnum);
|
|
+ if (oldtype < 0) {
|
|
+ free(name);
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ int newnum = oldnum - drmGetMinorBase(oldtype) + drmGetMinorBase(type);
|
|
+ snprintf(name, DRM_NODE_NAME_MAX, dev_name, DRM_DIR_NAME, newnum);
|
|
+ return name;
|
|
+#elif defined(__NetBSD__)
|
|
+ struct stat buf;
|
|
+ char name[64];
|
|
+
|
|
+ fstat(fd, &buf);
|
|
+ snprintf(name, sizeof(name), "/dev/%s",
|
|
+ devname(buf.st_rdev, S_IFCHR));
|
|
+
|
|
+ return strdup(name);
|
|
#else
|
|
- struct stat sbuf;
|
|
- char buf[PATH_MAX + 1];
|
|
- const char *dev_name;
|
|
+ stat_t sbuf;
|
|
+ char buf[DRM_NODE_NAME_MAX];
|
|
+ const char *dev_name = drmGetDeviceName(type);
|
|
unsigned int maj, min;
|
|
int n, base;
|
|
|
|
+ if (!dev_name)
|
|
+ return NULL;
|
|
+
|
|
if (fstat(fd, &sbuf))
|
|
return NULL;
|
|
|
|
@@ -2890,20 +3001,6 @@ out_close_dir:
|
|
if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
|
|
return NULL;
|
|
|
|
- switch (type) {
|
|
- case DRM_NODE_PRIMARY:
|
|
- dev_name = DRM_DEV_NAME;
|
|
- break;
|
|
- case DRM_NODE_CONTROL:
|
|
- dev_name = DRM_CONTROL_DEV_NAME;
|
|
- break;
|
|
- case DRM_NODE_RENDER:
|
|
- dev_name = DRM_RENDER_DEV_NAME;
|
|
- break;
|
|
- default:
|
|
- return NULL;
|
|
- };
|
|
-
|
|
base = drmGetMinorBase(type);
|
|
if (base < 0)
|
|
return NULL;
|
|
@@ -3001,7 +3098,9 @@ static int drmParseSubsystemType(int maj
|
|
return DRM_BUS_HOST1X;
|
|
|
|
return -EINVAL;
|
|
-#elif defined(__OpenBSD__)
|
|
+#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
|
+ return DRM_BUS_PCI;
|
|
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
|
|
return DRM_BUS_PCI;
|
|
#else
|
|
#warning "Missing implementation of drmParseSubsystemType"
|
|
@@ -3009,7 +3108,8 @@ static int drmParseSubsystemType(int maj
|
|
#endif
|
|
}
|
|
|
|
-static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info)
|
|
+static int drmParsePciBusInfo(const char *node, int node_type,
|
|
+ int maj, int min, drmPciBusInfoPtr info)
|
|
{
|
|
#ifdef __linux__
|
|
unsigned int domain, bus, dev, func;
|
|
@@ -3034,23 +3134,30 @@ static int drmParsePciBusInfo(int maj, i
|
|
info->func = func;
|
|
|
|
return 0;
|
|
-#elif defined(__OpenBSD__)
|
|
+#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
|
struct drm_pciinfo pinfo;
|
|
int fd, type;
|
|
|
|
+ drmMsg("[drm] drmParsePciBusInfo: min (%d)\n", min);
|
|
+
|
|
type = drmGetMinorType(min);
|
|
if (type == -1)
|
|
return -ENODEV;
|
|
|
|
+ drmMsg("[drm] drmParsePciBusInfo: type (%d), DRM_NODE_PRIMARY (%d)\n",
|
|
+ type, DRM_NODE_PRIMARY);
|
|
+
|
|
fd = drmOpenMinor(min, 0, type);
|
|
if (fd < 0)
|
|
return -errno;
|
|
|
|
if (drmIoctl(fd, DRM_IOCTL_GET_PCIINFO, &pinfo)) {
|
|
close(fd);
|
|
+ drmMsg("[drm] drmParsePciBusInfo: FAILED ioctl (0x%08lx), fd (%d)\n", DRM_IOCTL_GET_PCIINFO, fd);
|
|
return -errno;
|
|
}
|
|
close(fd);
|
|
+ drmMsg("[drm] drmParsePciBusInfo: SUCCESS ioctl (0x%08lx), fd (%d)\n", DRM_IOCTL_GET_PCIINFO, fd);
|
|
|
|
info->domain = pinfo.domain;
|
|
info->bus = pinfo.bus;
|
|
@@ -3058,6 +3165,83 @@ static int drmParsePciBusInfo(int maj, i
|
|
info->func = pinfo.func;
|
|
|
|
return 0;
|
|
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
|
|
+
|
|
+ drmMsg("[drm] drmParsePciBusInfo: node (%s), node_type (%d)\n", node, node_type);
|
|
+ drmMsg("[drm] drmParsePciBusInfo: maj (0x%x = %d), min (0x%x = %d), rdev (0x%x)\n",
|
|
+ maj, maj, min, min, makedev(maj, min));
|
|
+
|
|
+ /*
|
|
+ * Only the primary nodes can be mapped to hw.dri.%i via major/minor
|
|
+ * Determine the primary node by offset and use its major/minor pair
|
|
+ */
|
|
+ if (node_type != DRM_NODE_PRIMARY) {
|
|
+ char name[DRM_NODE_NAME_MAX];
|
|
+
|
|
+ drmMsg("[drm] drmParsePciBusInfo: node_type (%d) != DRM_NODE_PRIMARY (%d)\n",
|
|
+ node_type, DRM_NODE_PRIMARY);
|
|
+
|
|
+ snprintf(name, sizeof(name), DRM_DEV_NAME, DRM_DIR_NAME,
|
|
+ drmGetNodeNumber(node) - drmGetMinorBase(node_type));
|
|
+
|
|
+ drmMsg("[drm] drmParsePciBusInfo: stat-ing name (%s)\n", name);
|
|
+
|
|
+ stat_t sbuf;
|
|
+ if (stat(name, &sbuf))
|
|
+ return -errno;
|
|
+
|
|
+ maj = major(sbuf.st_rdev);
|
|
+ min = minor(sbuf.st_rdev);
|
|
+
|
|
+ drmMsg("[drm] drmParsePciBusInfo: maj (0x%x = %d), min (0x%x = %d), rdev (0x%x)\n",
|
|
+ maj, maj, min, min, makedev(maj, min));
|
|
+ }
|
|
+ /*
|
|
+ * Major/minor appear after the driver name in the hw.dri.%i.name node
|
|
+ * Find the node with matching major/minor pair and parse the bus ID,
|
|
+ * which may be after the name or may be alone in hw.dri.%i.busid
|
|
+ */
|
|
+ #define bus_fmt "pci:%04x:%02x:%02x.%d"
|
|
+ #define name_fmt "%*s 0x%x " bus_fmt
|
|
+ for (int i = 0; i < DRM_MAX_MINOR; ++i) {
|
|
+ char name[16], value[256];
|
|
+ size_t length = sizeof(value);
|
|
+ snprintf(name, sizeof(name), "hw.dri.%d.name", i);
|
|
+ if (sysctlbyname(name, value, &length, NULL, 0))
|
|
+ continue;
|
|
+
|
|
+ value[length] = '\0';
|
|
+
|
|
+ drmMsg("[drm] drmParsePciBusInfo: sysctl name (%s) has value (%s)\n", name, value);
|
|
+
|
|
+ unsigned int rdev = 0, domain = 0, bus = 0, slot = 0, func = 0;
|
|
+ int vals = sscanf(value, name_fmt, &rdev, &domain, &bus, &slot, &func);
|
|
+
|
|
+ if (vals >= 1 && rdev == makedev(maj,min)) {
|
|
+ if (vals < 5) {
|
|
+
|
|
+ drmMsg("[drm] drmParsePciBusInfo: busid not in sysctl name, try busid\n");
|
|
+
|
|
+ /* busid not in the name, try busid */
|
|
+ length = sizeof(value);
|
|
+ snprintf(name, sizeof(name), "hw.dri.%d.busid", i);
|
|
+ if (sysctlbyname(name, value, &length, NULL, 0))
|
|
+ break;
|
|
+ value[length] = '\0';
|
|
+
|
|
+ drmMsg("[drm] drmParsePciBusInfo: sysctl busid (%s) has value (%s)\n", name, value);
|
|
+
|
|
+ if (sscanf(value, bus_fmt, &domain, &bus, &slot, &func) != 4)
|
|
+ break;
|
|
+ }
|
|
+ info->domain = domain;
|
|
+ info->bus = bus;
|
|
+ info->dev = slot;
|
|
+ info->func = func;
|
|
+ return 0;
|
|
+ }
|
|
+ }
|
|
+ return -ENODEV;
|
|
#else
|
|
#warning "Missing implementation of drmParsePciBusInfo"
|
|
return -EINVAL;
|
|
@@ -3092,32 +3276,6 @@ int drmDevicesEqual(drmDevicePtr a, drmD
|
|
return 0;
|
|
}
|
|
|
|
-static int drmGetNodeType(const char *name)
|
|
-{
|
|
- if (strncmp(name, DRM_PRIMARY_MINOR_NAME,
|
|
- sizeof(DRM_PRIMARY_MINOR_NAME) - 1) == 0)
|
|
- return DRM_NODE_PRIMARY;
|
|
-
|
|
- if (strncmp(name, DRM_CONTROL_MINOR_NAME,
|
|
- sizeof(DRM_CONTROL_MINOR_NAME ) - 1) == 0)
|
|
- return DRM_NODE_CONTROL;
|
|
-
|
|
- if (strncmp(name, DRM_RENDER_MINOR_NAME,
|
|
- sizeof(DRM_RENDER_MINOR_NAME) - 1) == 0)
|
|
- return DRM_NODE_RENDER;
|
|
-
|
|
- return -EINVAL;
|
|
-}
|
|
-
|
|
-static int drmGetMaxNodeName(void)
|
|
-{
|
|
- return sizeof(DRM_DIR_NAME) +
|
|
- MAX3(sizeof(DRM_PRIMARY_MINOR_NAME),
|
|
- sizeof(DRM_CONTROL_MINOR_NAME),
|
|
- sizeof(DRM_RENDER_MINOR_NAME)) +
|
|
- 3 /* length of the node number */;
|
|
-}
|
|
-
|
|
#ifdef __linux__
|
|
static int parse_separate_sysfs_files(int maj, int min,
|
|
drmPciDeviceInfoPtr device,
|
|
@@ -3187,6 +3345,7 @@ static int parse_config_sysfs_file(int m
|
|
#endif
|
|
|
|
static int drmParsePciDeviceInfo(int maj, int min,
|
|
+ drmPciBusInfoPtr info,
|
|
drmPciDeviceInfoPtr device,
|
|
uint32_t flags)
|
|
{
|
|
@@ -3198,23 +3357,31 @@ static int drmParsePciDeviceInfo(int maj
|
|
return parse_config_sysfs_file(maj, min, device);
|
|
|
|
return 0;
|
|
-#elif defined(__OpenBSD__)
|
|
+#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
|
struct drm_pciinfo pinfo;
|
|
int fd, type;
|
|
|
|
+ drmMsg("[drm] drmParsePciDeviceInfo: min (%d)\n", min);
|
|
+
|
|
type = drmGetMinorType(min);
|
|
if (type == -1)
|
|
return -ENODEV;
|
|
|
|
+ drmMsg("[drm] drmParsePciDeviceInfo: type (%d), DRM_NODE_PRIMARY (%d)\n",
|
|
+ type, DRM_NODE_PRIMARY);
|
|
+
|
|
fd = drmOpenMinor(min, 0, type);
|
|
if (fd < 0)
|
|
return -errno;
|
|
|
|
+
|
|
if (drmIoctl(fd, DRM_IOCTL_GET_PCIINFO, &pinfo)) {
|
|
close(fd);
|
|
+ drmMsg("[drm] drmParsePciDeviceInfo: FAILED ioctl (0x%08lx), fd (%d)\n", DRM_IOCTL_GET_PCIINFO, fd);
|
|
return -errno;
|
|
}
|
|
close(fd);
|
|
+ drmMsg("[drm] drmParsePciDeviceInfo: SUCCESS ioctl (0x%08lx), fd (%d)\n", DRM_IOCTL_GET_PCIINFO, fd);
|
|
|
|
device->vendor_id = pinfo.vendor_id;
|
|
device->device_id = pinfo.device_id;
|
|
@@ -3223,6 +3390,48 @@ static int drmParsePciDeviceInfo(int maj
|
|
device->subdevice_id = pinfo.subdevice_id;
|
|
|
|
return 0;
|
|
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
|
|
+ struct pci_conf_io pc;
|
|
+ struct pci_match_conf patterns[1];
|
|
+ struct pci_conf results[1];
|
|
+
|
|
+ int fd = open("/dev/pci", O_RDONLY, 0);
|
|
+
|
|
+ drmMsg("[drm] drmParsePciDeviceInfo: opened /dev/pci with fd (%d)\n", fd);
|
|
+
|
|
+ if (fd < 0)
|
|
+ return -errno;
|
|
+
|
|
+ bzero(&patterns, sizeof(patterns));
|
|
+ patterns[0].pc_sel.pc_domain = info->domain;
|
|
+ patterns[0].pc_sel.pc_bus = info->bus;
|
|
+ patterns[0].pc_sel.pc_dev = info->dev;
|
|
+ patterns[0].pc_sel.pc_func = info->func;
|
|
+ patterns[0].flags = PCI_GETCONF_MATCH_DOMAIN | PCI_GETCONF_MATCH_BUS
|
|
+ | PCI_GETCONF_MATCH_DEV | PCI_GETCONF_MATCH_FUNC;
|
|
+ bzero(&pc, sizeof(struct pci_conf_io));
|
|
+ pc.num_patterns = 1;
|
|
+ pc.pat_buf_len = sizeof(patterns);
|
|
+ pc.patterns = patterns;
|
|
+ pc.match_buf_len = sizeof(results);
|
|
+ pc.matches = results;
|
|
+
|
|
+ if (ioctl(fd, PCIOCGETCONF, &pc) || pc.status == PCI_GETCONF_ERROR) {
|
|
+ int error = errno;
|
|
+ close(fd);
|
|
+ drmMsg("[drm] drmParsePciDeviceInfo: FAILED ioctl (0x%08lx), fd (%d)\n", PCIOCGETCONF, fd);
|
|
+ return -error;
|
|
+ }
|
|
+ close(fd);
|
|
+ drmMsg("[drm] drmParsePciDeviceInfo: SUCCESS ioctl (0x%08lx), fd (%d)\n", PCIOCGETCONF, fd);
|
|
+
|
|
+ device->vendor_id = results[0].pc_vendor;
|
|
+ device->device_id = results[0].pc_device;
|
|
+ device->subvendor_id = results[0].pc_subvendor;
|
|
+ device->subdevice_id = results[0].pc_subdevice;
|
|
+ device->revision_id = results[0].pc_revid;
|
|
+
|
|
+ return 0;
|
|
#else
|
|
#warning "Missing implementation of drmParsePciDeviceInfo"
|
|
return -EINVAL;
|
|
@@ -3303,7 +3512,7 @@ static drmDevicePtr drmDeviceAlloc(unsig
|
|
unsigned int i;
|
|
char *ptr;
|
|
|
|
- max_node_length = ALIGN(drmGetMaxNodeName(), sizeof(void *));
|
|
+ max_node_length = ALIGN(DRM_NODE_NAME_MAX, sizeof(void *));
|
|
extra = DRM_NODE_MAX * (sizeof(void *) + max_node_length);
|
|
|
|
size = sizeof(*device) + extra + bus_size + device_size;
|
|
@@ -3340,6 +3549,11 @@ static int drmProcessPciDevice(drmDevice
|
|
char *addr;
|
|
int ret;
|
|
|
|
+ drmMsg("[drm] drmProcessPciDevice: node (%s), node_type (%d)\n",
|
|
+ node, node_type);
|
|
+ drmMsg("[drm] drmProcessPciDevice: maj (%d = 0x%x), min (%d = 0x%x), rdev (0x%x), flags (0x%x)\n",
|
|
+ maj, maj, min, min, makedev(maj, min), flags);
|
|
+
|
|
dev = drmDeviceAlloc(node_type, node, sizeof(drmPciBusInfo),
|
|
sizeof(drmPciDeviceInfo), &addr);
|
|
if (!dev)
|
|
@@ -3349,18 +3563,36 @@ static int drmProcessPciDevice(drmDevice
|
|
|
|
dev->businfo.pci = (drmPciBusInfoPtr)addr;
|
|
|
|
- ret = drmParsePciBusInfo(maj, min, dev->businfo.pci);
|
|
+ ret = drmParsePciBusInfo(node, node_type, maj, min, dev->businfo.pci);
|
|
+
|
|
if (ret)
|
|
goto free_device;
|
|
|
|
+ drmMsg("[drm] drmProcessPciDevice: DOMAIN (%04x)\n", dev->businfo.pci->domain);
|
|
+ drmMsg("[drm] drmProcessPciDevice: BUS (%02x)\n", dev->businfo.pci->bus);
|
|
+ drmMsg("[drm] drmProcessPciDevice: DEV (%02x)\n", dev->businfo.pci->dev);
|
|
+ drmMsg("[drm] drmProcessPciDevice: FUNC (%1u)\n", dev->businfo.pci->func);
|
|
+
|
|
// Fetch the device info if the user has requested it
|
|
if (fetch_deviceinfo) {
|
|
addr += sizeof(drmPciBusInfo);
|
|
dev->deviceinfo.pci = (drmPciDeviceInfoPtr)addr;
|
|
|
|
- ret = drmParsePciDeviceInfo(maj, min, dev->deviceinfo.pci, flags);
|
|
+ ret = drmParsePciDeviceInfo(maj, min, dev->businfo.pci, dev->deviceinfo.pci, flags);
|
|
+
|
|
if (ret)
|
|
goto free_device;
|
|
+
|
|
+ drmMsg("[drm] drmProcessPciDevice: VENDOR (%04x)\n",
|
|
+ dev->deviceinfo.pci->vendor_id);
|
|
+ drmMsg("[drm] drmProcessPciDevice: DEVICE (%04x)\n",
|
|
+ dev->deviceinfo.pci->device_id);
|
|
+ drmMsg("[drm] drmProcessPciDevice: SUBVENDOR (%04x)\n",
|
|
+ dev->deviceinfo.pci->subvendor_id);
|
|
+ drmMsg("[drm] drmProcessPciDevice: SUBDEVICE (%04x)\n",
|
|
+ dev->deviceinfo.pci->subdevice_id);
|
|
+ drmMsg("[drm] drmProcessPciDevice: REVISION (%02x)\n",
|
|
+ dev->deviceinfo.pci->revision_id);
|
|
}
|
|
|
|
*device = dev;
|
|
@@ -3708,7 +3940,7 @@ static void drmFoldDuplicatedDevices(drm
|
|
local_devices[i]->available_nodes |= local_devices[j]->available_nodes;
|
|
node_type = log2(local_devices[j]->available_nodes);
|
|
memcpy(local_devices[i]->nodes[node_type],
|
|
- local_devices[j]->nodes[node_type], drmGetMaxNodeName());
|
|
+ local_devices[j]->nodes[node_type], DRM_NODE_NAME_MAX);
|
|
drmFreeDevice(&local_devices[j]);
|
|
}
|
|
}
|
|
@@ -3726,7 +3958,7 @@ drm_device_validate_flags(uint32_t flags
|
|
* Get information about the opened drm device
|
|
*
|
|
* \param fd file descriptor of the drm device
|
|
- * \param flags feature/behaviour bitmask
|
|
+ * \param flags feature/behavior bitmask
|
|
* \param device the address of a drmDevicePtr where the information
|
|
* will be allocated in stored
|
|
*
|
|
@@ -3744,8 +3976,8 @@ int drmGetDevice2(int fd, uint32_t flags
|
|
* Avoid stat'ing all of /dev needlessly by implementing this custom path.
|
|
*/
|
|
drmDevicePtr d;
|
|
- struct stat sbuf;
|
|
- char node[PATH_MAX + 1];
|
|
+ stat_t sbuf;
|
|
+ char node[DRM_NODE_NAME_MAX];
|
|
const char *dev_name;
|
|
int node_type, subsystem_type;
|
|
int maj, min, n, ret, base;
|
|
@@ -3766,26 +3998,16 @@ int drmGetDevice2(int fd, uint32_t flags
|
|
if (node_type == -1)
|
|
return -ENODEV;
|
|
|
|
- switch (node_type) {
|
|
- case DRM_NODE_PRIMARY:
|
|
- dev_name = DRM_DEV_NAME;
|
|
- break;
|
|
- case DRM_NODE_CONTROL:
|
|
- dev_name = DRM_CONTROL_DEV_NAME;
|
|
- break;
|
|
- case DRM_NODE_RENDER:
|
|
- dev_name = DRM_RENDER_DEV_NAME;
|
|
- break;
|
|
- default:
|
|
+ dev_name = drmGetDeviceName(node_type);
|
|
+ if (!dev_name)
|
|
return -EINVAL;
|
|
- };
|
|
|
|
base = drmGetMinorBase(node_type);
|
|
if (base < 0)
|
|
return -EINVAL;
|
|
|
|
- n = snprintf(node, PATH_MAX, dev_name, DRM_DIR_NAME, min - base);
|
|
- if (n == -1 || n >= PATH_MAX)
|
|
+ n = snprintf(node, sizeof(node), dev_name, DRM_DIR_NAME, min - base);
|
|
+ if (n == -1 || n >= sizeof(node))
|
|
return -errno;
|
|
if (stat(node, &sbuf))
|
|
return -EINVAL;
|
|
@@ -3806,14 +4028,17 @@ int drmGetDevice2(int fd, uint32_t flags
|
|
drmDevicePtr d;
|
|
DIR *sysdir;
|
|
struct dirent *dent;
|
|
- struct stat sbuf;
|
|
- char node[PATH_MAX + 1];
|
|
+ stat_t sbuf;
|
|
+ char node[DRM_NODE_NAME_MAX];
|
|
int node_type, subsystem_type;
|
|
int maj, min;
|
|
int ret, i, node_count;
|
|
int max_count = 16;
|
|
dev_t find_rdev;
|
|
|
|
+ drmMsg("[drm] drmGetDevice2: fd (%d), flags (%d) vs expected (%d)\n",
|
|
+ fd, flags, DRM_DEVICE_GET_PCI_REVISION);
|
|
+
|
|
if (drm_device_validate_flags(flags))
|
|
return -EINVAL;
|
|
|
|
@@ -3827,11 +4052,16 @@ int drmGetDevice2(int fd, uint32_t flags
|
|
maj = major(sbuf.st_rdev);
|
|
min = minor(sbuf.st_rdev);
|
|
|
|
- if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
|
|
+ drmMsg("[drm] drmGetDevice2: maj (%d = 0x%x), min (%d = 0x%x), rdev (0x%x)\n",
|
|
+ maj, maj, min, min, makedev(maj, min));
|
|
+
|
|
+ if ((DRM_MAJOR && maj != DRM_MAJOR) || !S_ISCHR(sbuf.st_mode))
|
|
return -EINVAL;
|
|
|
|
subsystem_type = drmParseSubsystemType(maj, min);
|
|
|
|
+ drmMsg("[drm] drmGetDevice2: subsystem_type (%d)\n", subsystem_type);
|
|
+
|
|
local_devices = calloc(max_count, sizeof(drmDevicePtr));
|
|
if (local_devices == NULL)
|
|
return -ENOMEM;
|
|
@@ -3848,14 +4078,14 @@ int drmGetDevice2(int fd, uint32_t flags
|
|
if (node_type < 0)
|
|
continue;
|
|
|
|
- snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, dent->d_name);
|
|
+ snprintf(node, sizeof(node), "%s/%s", DRM_DIR_NAME, dent->d_name);
|
|
if (stat(node, &sbuf))
|
|
continue;
|
|
|
|
maj = major(sbuf.st_rdev);
|
|
min = minor(sbuf.st_rdev);
|
|
|
|
- if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
|
|
+ if ((DRM_MAJOR && maj != DRM_MAJOR) || !S_ISCHR(sbuf.st_mode))
|
|
continue;
|
|
|
|
if (drmParseSubsystemType(maj, min) != subsystem_type)
|
|
@@ -3924,6 +4154,9 @@ int drmGetDevice2(int fd, uint32_t flags
|
|
free(local_devices);
|
|
if (*device == NULL)
|
|
return -ENODEV;
|
|
+
|
|
+ drmMsg("[drm] drmGetDevice2: SUCCESS\n");
|
|
+
|
|
return 0;
|
|
|
|
free_devices:
|
|
@@ -3972,13 +4205,16 @@ int drmGetDevices2(uint32_t flags, drmDe
|
|
drmDevicePtr device;
|
|
DIR *sysdir;
|
|
struct dirent *dent;
|
|
- struct stat sbuf;
|
|
- char node[PATH_MAX + 1];
|
|
+ stat_t sbuf;
|
|
+ char node[DRM_NODE_NAME_MAX];
|
|
int node_type, subsystem_type;
|
|
int maj, min;
|
|
int ret, i, node_count, device_count;
|
|
int max_count = 16;
|
|
|
|
+ drmMsg("[drm] drmGetDevices2: flags (%d) vs expected (%d), max_devices (%d)\n",
|
|
+ flags, DRM_DEVICE_GET_PCI_REVISION, max_devices);
|
|
+
|
|
if (drm_device_validate_flags(flags))
|
|
return -EINVAL;
|
|
|
|
@@ -3998,14 +4234,14 @@ int drmGetDevices2(uint32_t flags, drmDe
|
|
if (node_type < 0)
|
|
continue;
|
|
|
|
- snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, dent->d_name);
|
|
+ snprintf(node, sizeof(node), "%s/%s", DRM_DIR_NAME, dent->d_name);
|
|
if (stat(node, &sbuf))
|
|
continue;
|
|
|
|
maj = major(sbuf.st_rdev);
|
|
min = minor(sbuf.st_rdev);
|
|
|
|
- if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
|
|
+ if ((DRM_MAJOR && maj != DRM_MAJOR) || !S_ISCHR(sbuf.st_mode))
|
|
continue;
|
|
|
|
subsystem_type = drmParseSubsystemType(maj, min);
|
|
@@ -4082,6 +4318,7 @@ int drmGetDevices2(uint32_t flags, drmDe
|
|
|
|
closedir(sysdir);
|
|
free(local_devices);
|
|
+ drmMsg("[drm] drmGetDevices2: SUCCESS: device_count (%d)\n", device_count);
|
|
return device_count;
|
|
|
|
free_devices:
|
|
@@ -4113,7 +4350,7 @@ int drmGetDevices(drmDevicePtr devices[]
|
|
char *drmGetDeviceNameFromFd2(int fd)
|
|
{
|
|
#ifdef __linux__
|
|
- struct stat sbuf;
|
|
+ stat_t sbuf;
|
|
char path[PATH_MAX + 1], *value;
|
|
unsigned int maj, min;
|
|
|
|
@@ -4136,9 +4373,48 @@ char *drmGetDeviceNameFromFd2(int fd)
|
|
free(value);
|
|
|
|
return strdup(path);
|
|
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
|
|
+ stat_t sbuf;
|
|
+
|
|
+ drmMsg("[drm] drmGetDeviceNameFromFd2: fd (%d)\n", fd);
|
|
+
|
|
+ if (fstat(fd, &sbuf))
|
|
+ return NULL;
|
|
+
|
|
+ dev_t rdev = sbuf.st_rdev;
|
|
+ /* minor numbers don't depend on node name suffix, search for a match */
|
|
+ for (int i = 0; i < DRM_MAX_MINOR; ++i) {
|
|
+ char node[DRM_NODE_NAME_MAX];
|
|
+ for (int j = 0; j < DRM_NODE_MAX; ++j) {
|
|
+ snprintf(node, sizeof(node), drmGetDeviceName(j),
|
|
+ DRM_DIR_NAME, drmGetMinorBase(j) + i);
|
|
+ if (stat(node, &sbuf) == 0 && sbuf.st_rdev == rdev) {
|
|
+
|
|
+ drmMsg("[drm] drmGetDeviceNameFromFd2: has device name (%s)\n", node);
|
|
+
|
|
+ return strdup(node);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ return NULL;
|
|
+#elif defined(__NetBSD__)
|
|
+ struct stat sbuf;
|
|
+ char path[64];
|
|
+
|
|
+ drmMsg("[drm] drmGetDeviceNameFromFd2: fd (%d)\n", fd);
|
|
+
|
|
+ if (fstat(fd, &sbuf))
|
|
+ return NULL;
|
|
+
|
|
+ snprintf(path, sizeof(path), "/dev/%s",
|
|
+ devname(sbuf.st_rdev, S_IFCHR));
|
|
+
|
|
+ drmMsg("[drm] drmGetDeviceNameFromFd2: has device name (%s)\n", path);
|
|
+
|
|
+ return strdup(path);
|
|
#else
|
|
- struct stat sbuf;
|
|
- char node[PATH_MAX + 1];
|
|
+ stat_t sbuf;
|
|
+ char node[DRM_NODE_NAME_MAX];
|
|
const char *dev_name;
|
|
int node_type;
|
|
int maj, min, n, base;
|
|
@@ -4156,26 +4432,16 @@ char *drmGetDeviceNameFromFd2(int fd)
|
|
if (node_type == -1)
|
|
return NULL;
|
|
|
|
- switch (node_type) {
|
|
- case DRM_NODE_PRIMARY:
|
|
- dev_name = DRM_DEV_NAME;
|
|
- break;
|
|
- case DRM_NODE_CONTROL:
|
|
- dev_name = DRM_CONTROL_DEV_NAME;
|
|
- break;
|
|
- case DRM_NODE_RENDER:
|
|
- dev_name = DRM_RENDER_DEV_NAME;
|
|
- break;
|
|
- default:
|
|
+ dev_name = drmGetDeviceName(node_type);
|
|
+ if (!dev_name)
|
|
return NULL;
|
|
- };
|
|
|
|
base = drmGetMinorBase(node_type);
|
|
if (base < 0)
|
|
return NULL;
|
|
|
|
- n = snprintf(node, PATH_MAX, dev_name, DRM_DIR_NAME, min - base);
|
|
- if (n == -1 || n >= PATH_MAX)
|
|
+ n = snprintf(node, sizeof(node), dev_name, DRM_DIR_NAME, min - base);
|
|
+ if (n == -1 || n >= sizeof(node))
|
|
return NULL;
|
|
|
|
return strdup(node);
|