Changeset View
Changeset View
Standalone View
Standalone View
graphics/libdrm/files/patch-xf86drm.c
Show All 15 Lines | |||||
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | ||||
+#include <sys/pciio.h> | +#include <sys/pciio.h> | ||||
+#endif | +#endif | ||||
+ | + | ||||
/* Not all systems have MAP_FAILED defined */ | /* Not all systems have MAP_FAILED defined */ | ||||
#ifndef MAP_FAILED | #ifndef MAP_FAILED | ||||
#define MAP_FAILED ((void *)-1) | #define MAP_FAILED ((void *)-1) | ||||
@@ -69,18 +76,8 @@ | @@ -69,8 +76,8 @@ | ||||
#include "util_math.h" | #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__) | #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | ||||
-#define DRM_MAJOR 145 | -#define DRM_MAJOR 145 | ||||
+#define DRM_MAJOR 0 /* Major ID unused on systems with devfs */ | +#define DRM_MAJOR 0 /* Major ID unused on systems with devfs */ | ||||
#endif | #endif | ||||
#ifdef __NetBSD__ | #ifdef __NetBSD__ | ||||
@@ -222,6 +219,89 @@ drm_public drmHashEntry *drmGetEntry(int fd) | @@ -222,6 +229,75 @@ drm_public drmHashEntry *drmGetEntry(int fd) | ||||
return entry; | return entry; | ||||
} | } | ||||
+static int drmGetMinorBase(int type) | +static int drmGetMinorBase(int type) | ||||
+{ | +{ | ||||
+ switch (type) { | + switch (type) { | ||||
+ case DRM_NODE_PRIMARY: | + case DRM_NODE_PRIMARY: | ||||
+ case DRM_NODE_CONTROL: | + case DRM_NODE_CONTROL: | ||||
+ case DRM_NODE_RENDER: | + case DRM_NODE_RENDER: | ||||
+ return type << 6; | + return type << 6; | ||||
+ default: | + default: | ||||
Show All 28 Lines | |||||
+ case DRM_NODE_RENDER: | + case DRM_NODE_RENDER: | ||||
+ return DRM_RENDER_MINOR_NAME; | + return DRM_RENDER_MINOR_NAME; | ||||
+ default: | + default: | ||||
+ return NULL; | + return NULL; | ||||
+ } | + } | ||||
+} | +} | ||||
+#endif | +#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) | +static int drmGetNodeNumber(const char *name) | ||||
+{ | +{ | ||||
+ size_t name_len = strnlen(name, DRM_NODE_NAME_MAX); | + size_t name_len = strnlen(name, DRM_NODE_NAME_MAX); | ||||
+ while (name_len && isdigit(name[name_len - 1])) | + while (name_len && isdigit(name[name_len - 1])) | ||||
+ --name_len; | + --name_len; | ||||
+ return strtol(name + name_len, NULL, 10); | + return strtol(name + name_len, NULL, 10); | ||||
+} | +} | ||||
+ | + | ||||
Show All 12 Lines | |||||
+ return DRM_NODE_RENDER; | + return DRM_NODE_RENDER; | ||||
+ | + | ||||
+ return -1; | + return -1; | ||||
+} | +} | ||||
+ | + | ||||
/** | /** | ||||
* Compare two busid strings | * Compare two busid strings | ||||
* | * | ||||
@@ -326,8 +406,8 @@ static int chown_check_return(const char *path, uid_t | @@ -340,10 +416,14 @@ | ||||
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; | |||||
@@ -335,21 +415,14 @@ static int drmOpenDevice(dev_t dev, int minor, int typ | |||||
gid_t group = DRM_DEV_GID; | gid_t group = DRM_DEV_GID; | ||||
#endif | #endif | ||||
- switch (type) { | if (!dev_name) | ||||
- 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; | return -EINVAL; | ||||
- }; | |||||
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | ||||
+ sprintf(buf, dev_name, DRM_DIR_NAME, minor + drmGetMinorBase(type)); | + sprintf(buf, dev_name, DRM_DIR_NAME, minor + drmGetMinorBase(type)); | ||||
+#else | +#else | ||||
sprintf(buf, dev_name, DRM_DIR_NAME, minor); | sprintf(buf, dev_name, DRM_DIR_NAME, minor); | ||||
+#endif | +#endif | ||||
drmMsg("drmOpenDevice: node name is %s\n", buf); | drmMsg("drmOpenDevice: node name is %s\n", buf); | ||||
if (drm_server_info && drm_server_info->get_perms) { | if (drm_server_info && drm_server_info->get_perms) { | ||||
@@ -453,27 +526,20 @@ wait_for_udev: | @@ -453,16 +533,20 @@ wait_for_udev: | ||||
static int drmOpenMinor(int minor, int create, int type) | static int drmOpenMinor(int minor, int create, int type) | ||||
{ | { | ||||
int fd; | int fd; | ||||
- char buf[64]; | char buf[DRM_NODE_NAME_MAX]; | ||||
- const char *dev_name; | const char *dev_name = drmGetDeviceName(type); | ||||
+ char buf[DRM_NODE_NAME_MAX]; | |||||
+ const char *dev_name = drmGetDeviceName(type); | |||||
if (create) | if (create) | ||||
return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type); | return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type); | ||||
- switch (type) { | if (!dev_name) | ||||
- 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; | return -EINVAL; | ||||
- }; | |||||
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | ||||
+ sprintf(buf, dev_name, DRM_DIR_NAME, minor + drmGetMinorBase(type)); | + sprintf(buf, dev_name, DRM_DIR_NAME, minor + drmGetMinorBase(type)); | ||||
+#else | +#else | ||||
sprintf(buf, dev_name, DRM_DIR_NAME, minor); | sprintf(buf, dev_name, DRM_DIR_NAME, minor); | ||||
+#endif | +#endif | ||||
if ((fd = open(buf, O_RDWR | O_CLOEXEC, 0)) >= 0) | if ((fd = open(buf, O_RDWR | O_CLOEXEC, 0)) >= 0) | ||||
return fd; | return fd; | ||||
return -errno; | return -errno; | ||||
@@ -514,51 +580,6 @@ drm_public int drmAvailable(void) | @@ -514,51 +598,6 @@ drm_public int drmAvailable(void) | ||||
return retval; | return retval; | ||||
} | } | ||||
-static int drmGetMinorBase(int type) | -static int drmGetMinorBase(int type) | ||||
-{ | -{ | ||||
- switch (type) { | - switch (type) { | ||||
- case DRM_NODE_PRIMARY: | - case DRM_NODE_PRIMARY: | ||||
- return 0; | - return 0; | ||||
Show All 35 Lines | |||||
- default: | - default: | ||||
- return NULL; | - return NULL; | ||||
- } | - } | ||||
-} | -} | ||||
- | - | ||||
/** | /** | ||||
* Open the device by bus ID. | * Open the device by bus ID. | ||||
* | * | ||||
@@ -2743,28 +2764,22 @@ drm_public int drmDropMaster(int fd) | @@ -2743,28 +2782,22 @@ drm_public int drmDropMaster(int fd) | ||||
drm_public char *drmGetDeviceNameFromFd(int fd) | drm_public char *drmGetDeviceNameFromFd(int fd) | ||||
{ | { | ||||
- char name[128]; | - char name[128]; | ||||
- struct stat sbuf; | - struct stat sbuf; | ||||
- dev_t d; | - dev_t d; | ||||
- int i; | - int i; | ||||
- | - | ||||
Show All 18 Lines | |||||
- if (i == DRM_MAX_MINOR) | - if (i == DRM_MAX_MINOR) | ||||
- return NULL; | - return NULL; | ||||
- | - | ||||
- return strdup(name); | - return strdup(name); | ||||
+ return NULL; | + return NULL; | ||||
} | } | ||||
static bool drmNodeIsDRM(int maj, int min) | static bool drmNodeIsDRM(int maj, int min) | ||||
@@ -2777,13 +2792,26 @@ static bool drmNodeIsDRM(int maj, int min) | @@ -2777,13 +2810,26 @@ static bool drmNodeIsDRM(int maj, int min) | ||||
maj, min); | maj, min); | ||||
return stat(path, &sbuf) == 0; | return stat(path, &sbuf) == 0; | ||||
#else | #else | ||||
- return maj == DRM_MAJOR; | - return maj == DRM_MAJOR; | ||||
+ return !DRM_MAJOR || maj == DRM_MAJOR; | + return !DRM_MAJOR || maj == DRM_MAJOR; | ||||
#endif | #endif | ||||
} | } | ||||
Show All 12 Lines | |||||
+ if (type < 0) | + if (type < 0) | ||||
+ errno = ENODEV; | + errno = ENODEV; | ||||
+ return type; | + return type; | ||||
+#else | +#else | ||||
+ stat_t sbuf; | + stat_t sbuf; | ||||
int maj, min, type; | int maj, min, type; | ||||
if (fstat(fd, &sbuf)) | if (fstat(fd, &sbuf)) | ||||
@@ -2801,6 +2829,7 @@ drm_public int drmGetNodeTypeFromFd(int fd) | @@ -2801,6 +2847,7 @@ drm_public int drmGetNodeTypeFromFd(int fd) | ||||
if (type == -1) | if (type == -1) | ||||
errno = ENODEV; | errno = ENODEV; | ||||
return type; | return type; | ||||
+#endif | +#endif | ||||
} | } | ||||
drm_public int drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, | drm_public int drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, | ||||
@@ -2841,7 +2870,7 @@ static char *drmGetMinorNameForFD(int fd, int type) | @@ -2841,7 +2888,7 @@ static char *drmGetMinorNameForFD(int fd, int type) | ||||
#ifdef __linux__ | #ifdef __linux__ | ||||
DIR *sysdir; | DIR *sysdir; | ||||
struct dirent *ent; | struct dirent *ent; | ||||
- struct stat sbuf; | - struct stat sbuf; | ||||
+ stat_t sbuf; | + stat_t sbuf; | ||||
const char *name = drmGetMinorName(type); | const char *name = drmGetMinorName(type); | ||||
int len; | int len; | ||||
char dev_name[64], buf[64]; | char dev_name[64], buf[64]; | ||||
@@ -2879,13 +2908,35 @@ static char *drmGetMinorNameForFD(int fd, int type) | @@ -2879,13 +2926,32 @@ static char *drmGetMinorNameForFD(int fd, int type) | ||||
closedir(sysdir); | closedir(sysdir); | ||||
return NULL; | return NULL; | ||||
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | ||||
+ const char *dev_name = drmGetDeviceName(type); | + const char *dev_name = drmGetDeviceName(type); | ||||
+ if (!dev_name) | + if (!dev_name) | ||||
+ return NULL; | + return NULL; | ||||
+ | + | ||||
+ char *name = drmGetDeviceNameFromFd2(fd); | + char *name = drmGetDeviceNameFromFd2(fd); | ||||
+ if (!name) | + if (!name) | ||||
+ return NULL; | + return NULL; | ||||
+ | + | ||||
+ int oldnum = drmGetNodeNumber(name); | + int oldnum = drmGetNodeNumber(name); | ||||
+ int oldtype = drmGetMinorType(oldnum); | + int oldtype = drmGetMinorType(oldnum); | ||||
+ if (oldtype < 0) { | + if (oldtype < 0) { | ||||
+ free(name); | + free(name); | ||||
+ return NULL; | + return NULL; | ||||
+ } | + } | ||||
+ | + | ||||
+ int newnum = oldnum - drmGetMinorBase(oldtype) + drmGetMinorBase(type); | + int newnum = oldnum - drmGetMinorBase(oldtype) + drmGetMinorBase(type); | ||||
+ snprintf(name, DRM_NODE_NAME_MAX, dev_name, DRM_DIR_NAME, newnum); | + snprintf(name, DRM_NODE_NAME_MAX, dev_name, DRM_DIR_NAME, newnum); | ||||
+ return name; | + return name; | ||||
#else | #else | ||||
- struct stat sbuf; | struct stat sbuf; | ||||
- char buf[PATH_MAX + 1]; | char buf[PATH_MAX + 1]; | ||||
- const char *dev_name; | const char *dev_name = drmGetDeviceName(type); | ||||
+ stat_t sbuf; | |||||
+ char buf[DRM_NODE_NAME_MAX]; | |||||
+ const char *dev_name = drmGetDeviceName(type); | |||||
unsigned int maj, min; | unsigned int maj, min; | ||||
int n, base; | int n; | ||||
+ if (!dev_name) | |||||
+ return NULL; | |||||
+ | |||||
if (fstat(fd, &sbuf)) | if (fstat(fd, &sbuf)) | ||||
return NULL; | return NULL; | ||||
@@ -2895,20 +2946,6 @@ static char *drmGetMinorNameForFD(int fd, int type) | @@ -3032,7 +3098,7 @@ static int drmParseSubsystemType(int maj, int min) | ||||
if (!drmNodeIsDRM(maj, min) || !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; | |||||
@@ -3032,7 +3069,7 @@ static int drmParseSubsystemType(int maj, int min) | |||||
} | } | ||||
return -EINVAL; | return -EINVAL; | ||||
-#elif defined(__OpenBSD__) || defined(__DragonFly__) | -#elif defined(__OpenBSD__) || defined(__DragonFly__) | ||||
+#elif defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | +#elif defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | ||||
return DRM_BUS_PCI; | return DRM_BUS_PCI; | ||||
#else | #else | ||||
#warning "Missing implementation of drmParseSubsystemType" | #warning "Missing implementation of drmParseSubsystemType" | ||||
@@ -3035,7 +3072,8 @@ get_pci_path(int maj, int min, char *pci_path) | @@ -3035,7 +3101,8 @@ get_pci_path(int maj, int min, char *pci_path) | ||||
*term = 0; | *term = 0; | ||||
} | } | ||||
-static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info) | -static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info) | ||||
+static int drmParsePciBusInfo(const char *node, int node_type, | +static int drmParsePciBusInfo(const char *node, int node_type, | ||||
+ int maj, int min, drmPciBusInfoPtr info) | + int maj, int min, drmPciBusInfoPtr info) | ||||
{ | { | ||||
#ifdef __linux__ | #ifdef __linux__ | ||||
unsigned int domain, bus, dev, func; | unsigned int domain, bus, dev, func; | ||||
@@ -3084,6 +3122,60 @@ static int drmParsePciBusInfo(int maj, int min, drmPci | @@ -3084,6 +3151,60 @@ static int drmParsePciBusInfo(int maj, int min, drmPci | ||||
info->func = pinfo.func; | info->func = pinfo.func; | ||||
return 0; | return 0; | ||||
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | ||||
+ /* | + /* | ||||
+ * Only the primary nodes can be mapped to hw.dri.%i via major/minor | + * 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 | + * Determine the primary node by offset and use its major/minor pair | ||||
+ */ | + */ | ||||
▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | |||||
+ info->func = func; | + info->func = func; | ||||
+ return 0; | + return 0; | ||||
+ } | + } | ||||
+ } | + } | ||||
+ return -ENODEV; | + return -ENODEV; | ||||
#else | #else | ||||
#warning "Missing implementation of drmParsePciBusInfo" | #warning "Missing implementation of drmParsePciBusInfo" | ||||
return -EINVAL; | return -EINVAL; | ||||
@@ -3118,32 +3210,6 @@ drm_public int drmDevicesEqual(drmDevicePtr a, drmDevi | @@ -3118,32 +3239,6 @@ drm_public int drmDevicesEqual(drmDevicePtr a, drmDevi | ||||
return 0; | return 0; | ||||
} | } | ||||
-static int drmGetNodeType(const char *name) | -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, | - if (strncmp(name, DRM_CONTROL_MINOR_NAME, | ||||
- sizeof(DRM_CONTROL_MINOR_NAME ) - 1) == 0) | - sizeof(DRM_CONTROL_MINOR_NAME ) - 1) == 0) | ||||
- return DRM_NODE_CONTROL; | - return DRM_NODE_CONTROL; | ||||
- | - | ||||
- if (strncmp(name, DRM_RENDER_MINOR_NAME, | - if (strncmp(name, DRM_RENDER_MINOR_NAME, | ||||
- sizeof(DRM_RENDER_MINOR_NAME) - 1) == 0) | - sizeof(DRM_RENDER_MINOR_NAME) - 1) == 0) | ||||
- return DRM_NODE_RENDER; | - return DRM_NODE_RENDER; | ||||
- | - | ||||
- if (strncmp(name, DRM_PRIMARY_MINOR_NAME, | |||||
- sizeof(DRM_PRIMARY_MINOR_NAME) - 1) == 0) | |||||
- return DRM_NODE_PRIMARY; | |||||
- | |||||
- return -EINVAL; | - return -EINVAL; | ||||
-} | -} | ||||
- | - | ||||
-static int drmGetMaxNodeName(void) | -static int drmGetMaxNodeName(void) | ||||
-{ | -{ | ||||
- return sizeof(DRM_DIR_NAME) + | - return sizeof(DRM_DIR_NAME) + | ||||
- MAX3(sizeof(DRM_PRIMARY_MINOR_NAME), | - MAX3(sizeof(DRM_PRIMARY_MINOR_NAME), | ||||
- sizeof(DRM_CONTROL_MINOR_NAME), | - sizeof(DRM_CONTROL_MINOR_NAME), | ||||
- sizeof(DRM_RENDER_MINOR_NAME)) + | - sizeof(DRM_RENDER_MINOR_NAME)) + | ||||
- 3 /* length of the node number */; | - 3 /* length of the node number */; | ||||
-} | -} | ||||
- | - | ||||
#ifdef __linux__ | #ifdef __linux__ | ||||
static int parse_separate_sysfs_files(int maj, int min, | static int parse_separate_sysfs_files(int maj, int min, | ||||
drmPciDeviceInfoPtr device, | drmPciDeviceInfoPtr device, | ||||
@@ -3216,6 +3282,7 @@ static int parse_config_sysfs_file(int maj, int min, | @@ -3216,6 +3311,7 @@ static int parse_config_sysfs_file(int maj, int min, | ||||
#endif | #endif | ||||
static int drmParsePciDeviceInfo(int maj, int min, | static int drmParsePciDeviceInfo(int maj, int min, | ||||
+ drmPciBusInfoPtr info, | + drmPciBusInfoPtr info, | ||||
drmPciDeviceInfoPtr device, | drmPciDeviceInfoPtr device, | ||||
uint32_t flags) | uint32_t flags) | ||||
{ | { | ||||
@@ -3252,6 +3319,43 @@ static int drmParsePciDeviceInfo(int maj, int min, | @@ -3252,6 +3348,43 @@ static int drmParsePciDeviceInfo(int maj, int min, | ||||
device->subdevice_id = pinfo.subdevice_id; | device->subdevice_id = pinfo.subdevice_id; | ||||
return 0; | return 0; | ||||
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | ||||
+ struct pci_conf_io pc; | + struct pci_conf_io pc; | ||||
+ struct pci_match_conf patterns[1]; | + struct pci_match_conf patterns[1]; | ||||
+ struct pci_conf results[1]; | + struct pci_conf results[1]; | ||||
+ | + | ||||
Show All 27 Lines | |||||
+ device->subvendor_id = results[0].pc_subvendor; | + device->subvendor_id = results[0].pc_subvendor; | ||||
+ device->subdevice_id = results[0].pc_subdevice; | + device->subdevice_id = results[0].pc_subdevice; | ||||
+ device->revision_id = results[0].pc_revid; | + device->revision_id = results[0].pc_revid; | ||||
+ | + | ||||
+ return 0; | + return 0; | ||||
#else | #else | ||||
#warning "Missing implementation of drmParsePciDeviceInfo" | #warning "Missing implementation of drmParsePciDeviceInfo" | ||||
return -EINVAL; | return -EINVAL; | ||||
@@ -3332,7 +3436,7 @@ static drmDevicePtr drmDeviceAlloc(unsigned int type, | @@ -3332,7 +3465,7 @@ static drmDevicePtr drmDeviceAlloc(unsigned int type, | ||||
unsigned int i; | unsigned int i; | ||||
char *ptr; | char *ptr; | ||||
- max_node_length = ALIGN(drmGetMaxNodeName(), sizeof(void *)); | - max_node_length = ALIGN(drmGetMaxNodeName(), sizeof(void *)); | ||||
+ max_node_length = ALIGN(DRM_NODE_NAME_MAX, sizeof(void *)); | + max_node_length = ALIGN(DRM_NODE_NAME_MAX, sizeof(void *)); | ||||
extra = DRM_NODE_MAX * (sizeof(void *) + max_node_length); | extra = DRM_NODE_MAX * (sizeof(void *) + max_node_length); | ||||
size = sizeof(*device) + extra + bus_size + device_size; | size = sizeof(*device) + extra + bus_size + device_size; | ||||
@@ -3378,7 +3482,7 @@ static int drmProcessPciDevice(drmDevicePtr *device, | @@ -3378,7 +3511,7 @@ static int drmProcessPciDevice(drmDevicePtr *device, | ||||
dev->businfo.pci = (drmPciBusInfoPtr)addr; | dev->businfo.pci = (drmPciBusInfoPtr)addr; | ||||
- ret = drmParsePciBusInfo(maj, min, dev->businfo.pci); | - ret = drmParsePciBusInfo(maj, min, dev->businfo.pci); | ||||
+ ret = drmParsePciBusInfo(node, node_type, maj, min, dev->businfo.pci); | + ret = drmParsePciBusInfo(node, node_type, maj, min, dev->businfo.pci); | ||||
if (ret) | if (ret) | ||||
goto free_device; | goto free_device; | ||||
@@ -3387,7 +3491,7 @@ static int drmProcessPciDevice(drmDevicePtr *device, | @@ -3387,7 +3520,7 @@ static int drmProcessPciDevice(drmDevicePtr *device, | ||||
addr += sizeof(drmPciBusInfo); | addr += sizeof(drmPciBusInfo); | ||||
dev->deviceinfo.pci = (drmPciDeviceInfoPtr)addr; | dev->deviceinfo.pci = (drmPciDeviceInfoPtr)addr; | ||||
- ret = drmParsePciDeviceInfo(maj, min, dev->deviceinfo.pci, flags); | - ret = drmParsePciDeviceInfo(maj, min, dev->deviceinfo.pci, flags); | ||||
+ ret = drmParsePciDeviceInfo(maj, min, dev->businfo.pci, dev->deviceinfo.pci, flags); | + ret = drmParsePciDeviceInfo(maj, min, dev->businfo.pci, dev->deviceinfo.pci, flags); | ||||
if (ret) | if (ret) | ||||
goto free_device; | goto free_device; | ||||
} | } | ||||
@@ -3727,8 +3831,8 @@ process_device(drmDevicePtr *device, const char *d_nam | @@ -3727,8 +3860,8 @@ process_device(drmDevicePtr *device, const char *d_nam | ||||
int req_subsystem_type, | int req_subsystem_type, | ||||
bool fetch_deviceinfo, uint32_t flags) | bool fetch_deviceinfo, uint32_t flags) | ||||
{ | { | ||||
- struct stat sbuf; | - struct stat sbuf; | ||||
- char node[PATH_MAX + 1]; | - char node[PATH_MAX + 1]; | ||||
+ stat_t sbuf; | + stat_t sbuf; | ||||
+ char node[DRM_NODE_NAME_MAX]; | + char node[DRM_NODE_NAME_MAX]; | ||||
int node_type, subsystem_type; | int node_type, subsystem_type; | ||||
unsigned int maj, min; | unsigned int maj, min; | ||||
@@ -3736,7 +3840,7 @@ process_device(drmDevicePtr *device, const char *d_nam | @@ -3736,7 +3869,7 @@ process_device(drmDevicePtr *device, const char *d_nam | ||||
if (node_type < 0) | if (node_type < 0) | ||||
return -1; | return -1; | ||||
- snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, d_name); | - snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, d_name); | ||||
+ snprintf(node, sizeof(node), "%s/%s", DRM_DIR_NAME, d_name); | + snprintf(node, sizeof(node), "%s/%s", DRM_DIR_NAME, d_name); | ||||
if (stat(node, &sbuf)) | if (stat(node, &sbuf)) | ||||
return -1; | return -1; | ||||
@@ -3784,7 +3888,7 @@ static void drmFoldDuplicatedDevices(drmDevicePtr loca | @@ -3784,7 +3917,7 @@ static void drmFoldDuplicatedDevices(drmDevicePtr loca | ||||
local_devices[i]->available_nodes |= local_devices[j]->available_nodes; | local_devices[i]->available_nodes |= local_devices[j]->available_nodes; | ||||
node_type = log2(local_devices[j]->available_nodes); | node_type = log2(local_devices[j]->available_nodes); | ||||
memcpy(local_devices[i]->nodes[node_type], | memcpy(local_devices[i]->nodes[node_type], | ||||
- local_devices[j]->nodes[node_type], drmGetMaxNodeName()); | - local_devices[j]->nodes[node_type], drmGetMaxNodeName()); | ||||
+ local_devices[j]->nodes[node_type], DRM_NODE_NAME_MAX); | + local_devices[j]->nodes[node_type], DRM_NODE_NAME_MAX); | ||||
drmFreeDevice(&local_devices[j]); | drmFreeDevice(&local_devices[j]); | ||||
} | } | ||||
} | } | ||||
@@ -3824,7 +3928,7 @@ drm_device_has_rdev(drmDevicePtr device, dev_t find_rd | @@ -3824,7 +3957,7 @@ drm_device_has_rdev(drmDevicePtr device, dev_t find_rd | ||||
* Get information about the opened drm device | * Get information about the opened drm device | ||||
* | * | ||||
* \param fd file descriptor of the drm device | * \param fd file descriptor of the drm device | ||||
- * \param flags feature/behaviour bitmask | - * \param flags feature/behaviour bitmask | ||||
+ * \param flags feature/behavior bitmask | + * \param flags feature/behavior bitmask | ||||
* \param device the address of a drmDevicePtr where the information | * \param device the address of a drmDevicePtr where the information | ||||
* will be allocated in stored | * will be allocated in stored | ||||
* | * | ||||
@@ -3842,8 +3946,8 @@ drm_public int drmGetDevice2(int fd, uint32_t flags, d | @@ -3842,8 +3975,8 @@ drm_public int drmGetDevice2(int fd, uint32_t flags, d | ||||
* Avoid stat'ing all of /dev needlessly by implementing this custom path. | * Avoid stat'ing all of /dev needlessly by implementing this custom path. | ||||
*/ | */ | ||||
drmDevicePtr d; | drmDevicePtr d; | ||||
- struct stat sbuf; | - struct stat sbuf; | ||||
- char node[PATH_MAX + 1]; | - char node[PATH_MAX + 1]; | ||||
+ stat_t sbuf; | + stat_t sbuf; | ||||
+ char node[DRM_NODE_NAME_MAX]; | + char node[DRM_NODE_NAME_MAX]; | ||||
const char *dev_name; | const char *dev_name; | ||||
int node_type, subsystem_type; | int node_type, subsystem_type; | ||||
int maj, min, n, ret, base; | int maj, min, n, ret, base; | ||||
@@ -3864,26 +3968,16 @@ drm_public int drmGetDevice2(int fd, uint32_t flags, d | @@ -3989,7 +4122,7 @@ drm_public int drmGetDevice(int fd, drmDevicePtr *devi | ||||
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; | |||||
@@ -3989,7 +4083,7 @@ drm_public int drmGetDevice(int fd, drmDevicePtr *devi | |||||
/** | /** | ||||
* Get drm devices on the system | * Get drm devices on the system | ||||
* | * | ||||
- * \param flags feature/behaviour bitmask | - * \param flags feature/behaviour bitmask | ||||
+ * \param flags feature/behavior bitmask | + * \param flags feature/behavior bitmask | ||||
* \param devices the array of devices with drmDevicePtr elements | * \param devices the array of devices with drmDevicePtr elements | ||||
* can be NULL to get the device number first | * can be NULL to get the device number first | ||||
* \param max_devices the maximum number of devices for the array | * \param max_devices the maximum number of devices for the array | ||||
@@ -4074,7 +4168,7 @@ drm_public int drmGetDevices(drmDevicePtr devices[], i | @@ -4074,7 +4207,7 @@ drm_public int drmGetDevices(drmDevicePtr devices[], i | ||||
drm_public char *drmGetDeviceNameFromFd2(int fd) | drm_public char *drmGetDeviceNameFromFd2(int fd) | ||||
{ | { | ||||
#ifdef __linux__ | #ifdef __linux__ | ||||
- struct stat sbuf; | - struct stat sbuf; | ||||
+ stat_t sbuf; | + stat_t sbuf; | ||||
char path[PATH_MAX + 1], *value; | char path[PATH_MAX + 1], *value; | ||||
unsigned int maj, min; | unsigned int maj, min; | ||||
@@ -4097,9 +4191,26 @@ drm_public char *drmGetDeviceNameFromFd2(int fd) | @@ -4097,9 +4230,26 @@ drm_public char *drmGetDeviceNameFromFd2(int fd) | ||||
free(value); | free(value); | ||||
return strdup(path); | return strdup(path); | ||||
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | ||||
+ stat_t sbuf; | + stat_t sbuf; | ||||
+ if (fstat(fd, &sbuf)) | + if (fstat(fd, &sbuf)) | ||||
+ return NULL; | + return NULL; | ||||
+ | + | ||||
Show All 12 Lines | |||||
#else | #else | ||||
- struct stat sbuf; | - struct stat sbuf; | ||||
- char node[PATH_MAX + 1]; | - char node[PATH_MAX + 1]; | ||||
+ stat_t sbuf; | + stat_t sbuf; | ||||
+ char node[DRM_NODE_NAME_MAX]; | + char node[DRM_NODE_NAME_MAX]; | ||||
const char *dev_name; | const char *dev_name; | ||||
int node_type; | int node_type; | ||||
int maj, min, n, base; | int maj, min, n, base; | ||||
@@ -4117,26 +4228,16 @@ drm_public 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); |