diff options
| -rw-r--r-- | libdrm/xf86drm.c | 24 | ||||
| -rw-r--r-- | linux-core/drm_bo.c | 21 | ||||
| -rw-r--r-- | linux-core/drm_drv.c | 1 | ||||
| -rw-r--r-- | linux-core/drm_objects.h | 1 | ||||
| -rw-r--r-- | shared-core/drm.h | 10 | 
5 files changed, 48 insertions, 9 deletions
| diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c index 82b77d7f..2f9d5c80 100644 --- a/libdrm/xf86drm.c +++ b/libdrm/xf86drm.c @@ -2855,6 +2855,30 @@ int drmMMUnlock(int fd, unsigned memType, int unlockBM)      return (ret) ? -errno : 0;  } +int drmBOVersion(int fd, unsigned int *major, +		 unsigned int *minor, +		 unsigned int *patchlevel) +{ +    struct drm_bo_version_arg arg; +    int ret; + +    memset(&arg, 0, sizeof(arg)); +    ret = ioctl(fd, DRM_IOCTL_BO_VERSION, &arg); +    if (ret) +	return ret; + +    if (major) +	*major = arg.major; +    if (minor) +	*minor = arg.minor; +    if (patchlevel) +	*patchlevel = arg.patchlevel; + +    return (ret) ? -errno : 0; +} + + +  #define DRM_MAX_FDS 16  static struct {      char *BusID; diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c index 039873ca..8d1e2f56 100644 --- a/linux-core/drm_bo.c +++ b/linux-core/drm_bo.c @@ -2260,17 +2260,10 @@ int drm_mm_init_ioctl(struct drm_device *dev, void *data, struct drm_file *file_  	}  	if (arg->major != DRM_BO_INIT_MAJOR) {  		DRM_ERROR("libdrm and kernel DRM buffer object interface major\n" -			  "\tversion don't match. Got %d, expected %d,\n", +			  "\tversion don't match. Got %d, expected %d.\n",  			  arg->major, DRM_BO_INIT_MAJOR);  		return -EINVAL;  	} -	if (arg->minor > DRM_BO_INIT_MINOR) { -		DRM_ERROR("libdrm expects a newer DRM buffer object interface.\n" -			  "\tlibdrm buffer object interface version is %d.%d.\n" -			  "\tkernel DRM buffer object interface version is %d.%d\n", -			  arg->major, arg->minor, DRM_BO_INIT_MAJOR, DRM_BO_INIT_MINOR); -		return -EINVAL; -	}  	mutex_lock(&dev->struct_mutex);  	if (!bm->initialized) { @@ -2535,3 +2528,15 @@ static int drm_bo_setup_vm_locked(struct drm_buffer_object * bo)  	return 0;  } + +int drm_bo_version_ioctl(struct drm_device *dev, void *data,  +			 struct drm_file *file_priv) +{ +	struct drm_bo_version_arg *arg = (struct drm_bo_version_arg *)data; +	 +	arg->major = DRM_BO_INIT_MAJOR; +	arg->minor = DRM_BO_INIT_MINOR; +	arg->patchlevel = DRM_BO_INIT_PATCH; + +	return 0; +} diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index 9c867f1b..330566bb 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -145,6 +145,7 @@ static struct drm_ioctl_desc drm_ioctls[] = {  	DRM_IOCTL_DEF(DRM_IOCTL_BO_SETSTATUS, drm_bo_setstatus_ioctl, DRM_AUTH),  	DRM_IOCTL_DEF(DRM_IOCTL_BO_INFO, drm_bo_info_ioctl, DRM_AUTH),  	DRM_IOCTL_DEF(DRM_IOCTL_BO_WAIT_IDLE, drm_bo_wait_idle_ioctl, DRM_AUTH), +	DRM_IOCTL_DEF(DRM_IOCTL_BO_VERSION, drm_bo_version_ioctl, 0),  };  #define DRM_CORE_IOCTL_COUNT	ARRAY_SIZE( drm_ioctls ) diff --git a/linux-core/drm_objects.h b/linux-core/drm_objects.h index 0b937dc0..702ece56 100644 --- a/linux-core/drm_objects.h +++ b/linux-core/drm_objects.h @@ -483,6 +483,7 @@ extern int drm_mm_init_ioctl(struct drm_device *dev, void *data, struct drm_file  extern int drm_mm_takedown_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);  extern int drm_mm_lock_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);  extern int drm_mm_unlock_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); +extern int drm_bo_version_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);  extern int drm_bo_driver_finish(struct drm_device *dev);  extern int drm_bo_driver_init(struct drm_device *dev);  extern int drm_bo_pci_offset(struct drm_device *dev, diff --git a/shared-core/drm.h b/shared-core/drm.h index 80c1a3e2..a48f347e 100644 --- a/shared-core/drm.h +++ b/shared-core/drm.h @@ -758,8 +758,9 @@ struct drm_fence_arg {  #define DRM_BO_HINT_WAIT_LAZY   0x00000008  #define DRM_BO_INIT_MAGIC 0xfe769812 -#define DRM_BO_INIT_MAJOR 0 +#define DRM_BO_INIT_MAJOR 1  #define DRM_BO_INIT_MINOR 1 +#define DRM_BO_INIT_PATCH 0  struct drm_bo_info_req { @@ -873,6 +874,12 @@ struct drm_bo_op_arg {  #define DRM_BO_LOCK_UNLOCK_BM       (1 << 0)  #define DRM_BO_LOCK_IGNORE_NO_EVICT (1 << 1) +struct drm_bo_version_arg { +	uint32_t major; +	uint32_t minor; +	uint32_t patchlevel; +}; +  struct drm_mm_type_arg {  	unsigned int mem_type;          unsigned int lock_flags; @@ -976,6 +983,7 @@ struct drm_mm_init_arg {  #define DRM_IOCTL_BO_SETSTATUS          DRM_IOWR(0xd3, struct drm_bo_map_wait_idle_arg)  #define DRM_IOCTL_BO_INFO               DRM_IOWR(0xd4, struct drm_bo_reference_info_arg)  #define DRM_IOCTL_BO_WAIT_IDLE          DRM_IOWR(0xd5, struct drm_bo_map_wait_idle_arg) +#define DRM_IOCTL_BO_VERSION          DRM_IOR(0xd6, struct drm_bo_version_arg)  /*@}*/ | 
