diff options
Diffstat (limited to 'linux-core')
| -rw-r--r-- | linux-core/drm_crtc.c | 30 | ||||
| -rw-r--r-- | linux-core/drm_crtc.h | 2 | ||||
| -rw-r--r-- | linux-core/drm_drv.c | 1 | 
3 files changed, 33 insertions, 0 deletions
| diff --git a/linux-core/drm_crtc.c b/linux-core/drm_crtc.c index b349527d..d1f3c077 100644 --- a/linux-core/drm_crtc.c +++ b/linux-core/drm_crtc.c @@ -1058,3 +1058,33 @@ int drm_mode_rmfb(struct inode *inode, struct file *filp,  	return 0;  } +int drm_mode_getfb(struct inode *inode, struct file *filp, +		   unsigned int cmd, unsigned long arg) +{ +	drm_file_t *priv = filp->private_data; +	drm_device_t *dev = priv->head->dev;	 +	struct drm_mode_fb_cmd __user *argp = (void __user *)arg; +	struct drm_mode_fb_cmd r; +	struct drm_framebuffer *fb; + +	if (copy_from_user(&r, argp, sizeof(r))) +		return -EFAULT; + +	fb = idr_find(&dev->mode_config.crtc_idr, r.buffer_id); +	if (!fb || (r.buffer_id != fb->id)) { +		DRM_ERROR("invalid framebuffer id\n"); +		return -EINVAL; +	} + +	r.height = fb->height; +	r.width = fb->width; +	r.depth = fb->depth; +	r.bpp = fb->bits_per_pixel; +	r.handle = fb->bo->base.hash.key; +	r.pitch = fb->pitch; + +	if (copy_to_user(argp, &r, sizeof(r))) +		return -EFAULT; + +	return 0; +} diff --git a/linux-core/drm_crtc.h b/linux-core/drm_crtc.h index 54c508c5..c02dcedc 100644 --- a/linux-core/drm_crtc.h +++ b/linux-core/drm_crtc.h @@ -474,5 +474,7 @@ extern int drm_mode_addfb(struct inode *inode, struct file *filp,  			  unsigned int cmd, unsigned long arg);  extern int drm_mode_rmfb(struct inode *inode, struct file *filp,  			 unsigned int cmd, unsigned long arg); +extern int drm_mode_getfb(struct inode *inode, struct file *filp, +			  unsigned int cmd, unsigned long arg);  #endif /* __DRM_CRTC_H__ */ diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index b43af328..b7a7aded 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -129,6 +129,7 @@ static drm_ioctl_desc_t drm_ioctls[] = {  	[DRM_IOCTL_NR(DRM_IOCTL_MODE_SETCRTC)] = {drm_mode_setcrtc, DRM_MASTER|DRM_ROOT_ONLY},  	[DRM_IOCTL_NR(DRM_IOCTL_MODE_ADDFB)] = {drm_mode_addfb, DRM_MASTER|DRM_ROOT_ONLY},  	[DRM_IOCTL_NR(DRM_IOCTL_MODE_RMFB)] = {drm_mode_rmfb, DRM_MASTER|DRM_ROOT_ONLY}, +	[DRM_IOCTL_NR(DRM_IOCTL_MODE_GETFB)] = {drm_mode_getfb, DRM_MASTER|DRM_ROOT_ONLY},  };  #define DRM_CORE_IOCTL_COUNT	ARRAY_SIZE( drm_ioctls ) | 
