aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xf86drm.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/xf86drm.c b/xf86drm.c
index a889d48d..f0fc4ee2 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -102,6 +102,22 @@
102#define DRM_MAJOR 226 /* Linux */ 102#define DRM_MAJOR 226 /* Linux */
103#endif 103#endif
104 104
105#ifdef __OpenBSD__
106struct drm_pciinfo {
107 uint16_t domain;
108 uint8_t bus;
109 uint8_t dev;
110 uint8_t func;
111 uint16_t vendor_id;
112 uint16_t device_id;
113 uint16_t subvendor_id;
114 uint16_t subdevice_id;
115 uint8_t revision_id;
116};
117
118#define DRM_IOCTL_GET_PCIINFO DRM_IOR(0x15, struct drm_pciinfo)
119#endif
120
105#define DRM_MSG_VERBOSITY 3 121#define DRM_MSG_VERBOSITY 3
106 122
107#define memclear(s) memset(&s, 0, sizeof(s)) 123#define memclear(s) memset(&s, 0, sizeof(s))
@@ -3061,6 +3077,31 @@ static int drmParsePciDeviceInfo(int maj, int min,
3061 return parse_config_sysfs_file(maj, min, device); 3077 return parse_config_sysfs_file(maj, min, device);
3062 3078
3063 return 0; 3079 return 0;
3080#elif defined(__OpenBSD__)
3081 struct drm_pciinfo pinfo;
3082 int fd, type;
3083
3084 type = drmGetMinorType(min);
3085 if (type == -1)
3086 return -ENODEV;
3087
3088 fd = drmOpenMinor(min, 0, type);
3089 if (fd < 0)
3090 return -errno;
3091
3092 if (drmIoctl(fd, DRM_IOCTL_GET_PCIINFO, &pinfo)) {
3093 close(fd);
3094 return -errno;
3095 }
3096 close(fd);
3097
3098 device->vendor_id = pinfo.vendor_id;
3099 device->device_id = pinfo.device_id;
3100 device->revision_id = pinfo.revision_id;
3101 device->subvendor_id = pinfo.subvendor_id;
3102 device->subdevice_id = pinfo.subdevice_id;
3103
3104 return 0;
3064#else 3105#else
3065#warning "Missing implementation of drmParsePciDeviceInfo" 3106#warning "Missing implementation of drmParsePciDeviceInfo"
3066 return -EINVAL; 3107 return -EINVAL;