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,35 @@ 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; | ||||
| + | + | ||||
| Show All 9 Lines | |||||
| + } | + } | ||||
| + | + | ||||
| + 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; | |||||
| + stat_t sbuf; | + stat_t sbuf; | ||||
| + char buf[DRM_NODE_NAME_MAX]; | + char buf[DRM_NODE_NAME_MAX]; | ||||
| + const char *dev_name = drmGetDeviceName(type); | const char *dev_name = drmGetDeviceName(type); | ||||
| unsigned int maj, min; | unsigned int maj, min; | ||||
| int n, base; | int n; | ||||
| + if (!dev_name) | + if (!dev_name) | ||||
| + return NULL; | + 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 +3101,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 +3104,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 +3154,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 +3242,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 +3314,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 +3351,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 +3468,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 +3514,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 +3523,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 +3863,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 +3872,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 +3920,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 +3960,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 +3978,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 +4125,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 +4210,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 +4233,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); | |||||