Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk> --- drivers/gpu/drm/i915/i915_dma.c | 3 ++ drivers/gpu/drm/i915/intel_display.c | 66 ++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/i915/intel_drv.h | 4 +++ include/uapi/drm/i915_drm.h | 11 ++++++ 4 files changed, 84 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 78939b6..5dcfbbe 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c @@ -1924,6 +1924,9 @@ struct drm_ioctl_desc i915_ioctls[] = { DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_DESTROY, i915_gem_context_destroy_ioctl, DRM_UNLOCKED), DRM_IOCTL_DEF_DRV(I915_REG_READ, i915_reg_read_ioctl, DRM_UNLOCKED), DRM_IOCTL_DEF_DRV(I915_GEM_USERPTR, i915_gem_userptr_ioctl, DRM_UNLOCKED), + + DRM_IOCTL_DEF_DRV(INTEL_FRAMEBUFFER_GETPARAM, intel_user_framebuffer_getparam, DRM_UNLOCKED), + DRM_IOCTL_DEF_DRV(INTEL_FRAMEBUFFER_SETPARAM, intel_user_framebuffer_setparam, DRM_UNLOCKED), }; int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls); diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 586a648..7bb8851 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -9198,6 +9198,72 @@ intel_user_framebuffer_create(struct drm_device *dev, return intel_framebuffer_create(dev, mode_cmd, obj); } +static int +__intel_user_framebuffer_getparam(struct intel_framebuffer *fb, + u32 param, u64 *value) +{ + switch (param) { + default: + return -EINVAL; + } +} + +int +intel_user_framebuffer_getparam(struct drm_device *dev, + void *data, + struct drm_file *file) +{ + struct intel_framebuffer_param *args = data; + struct drm_framebuffer *fb, *iter; + int ret = -ENOENT; + + mutex_lock(&file->fbs_lock); + fb = drm_framebuffer_lookup(dev, args->fb_id); + list_for_each_entry(iter, &file->fbs, filp_head) { + if (fb == iter) { + ret = __intel_user_framebuffer_getparam(to_intel_framebuffer(fb), + args->param, + &args->value); + break; + } + } + mutex_unlock(&file->fbs_lock); + return ret; +} + +static int +__intel_user_framebuffer_setparam(struct intel_framebuffer *fb, + u32 param, u64 value) +{ + switch (param) { + default: + return -EINVAL; + } +} + +int +intel_user_framebuffer_setparam(struct drm_device *dev, + void *data, + struct drm_file *file) +{ + struct intel_framebuffer_param *args = data; + struct drm_framebuffer *fb, *iter; + int ret = -ENOENT; + + mutex_lock(&file->fbs_lock); + fb = drm_framebuffer_lookup(dev, args->fb_id); + list_for_each_entry(iter, &file->fbs, filp_head) { + if (fb == iter) { + ret = __intel_user_framebuffer_setparam(to_intel_framebuffer(fb), + args->param, + args->value); + break; + } + } + mutex_unlock(&file->fbs_lock); + return ret; +} + static const struct drm_mode_config_funcs intel_mode_funcs = { .fb_create = intel_user_framebuffer_create, .output_poll_changed = intel_fb_output_poll_changed, diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 05d798f..b679adfb 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -732,6 +732,10 @@ extern int intel_framebuffer_init(struct drm_device *dev, struct intel_framebuffer *ifb, struct drm_mode_fb_cmd2 *mode_cmd, struct drm_i915_gem_object *obj); +extern int intel_user_framebuffer_getparam(struct drm_device *dev, + void *data, struct drm_file *file); +extern int intel_user_framebuffer_setparam(struct drm_device *dev, + void *data, struct drm_file *file); extern int intel_fbdev_init(struct drm_device *dev); extern void intel_fbdev_initial_config(struct drm_device *dev); extern void intel_fbdev_fini(struct drm_device *dev); diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h index b27e6b9..38a9b52 100644 --- a/include/uapi/drm/i915_drm.h +++ b/include/uapi/drm/i915_drm.h @@ -199,6 +199,8 @@ typedef struct _drm_i915_sarea { #define DRM_I915_GEM_GET_CACHING 0x30 #define DRM_I915_REG_READ 0x31 #define DRM_I915_GEM_USERPTR 0x32 +#define DRM_INTEL_FRAMEBUFFER_GETPARAM 0x33 +#define DRM_INTEL_FRAMEBUFFER_SETPARAM 0x34 #define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) #define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH) @@ -249,6 +251,8 @@ typedef struct _drm_i915_sarea { #define DRM_IOCTL_I915_GEM_CONTEXT_DESTROY DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_DESTROY, struct drm_i915_gem_context_destroy) #define DRM_IOCTL_I915_REG_READ DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_REG_READ, struct drm_i915_reg_read) #define DRM_IOCTL_I915_GEM_USERPTR DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_USERPTR, struct drm_i915_gem_userptr) +#define DRM_IOCTL_INTEL_FRAMEBUFFER_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_INTEL_FRAMEBUFFER_GETPARAM, struct intel_framebuffer_param) +#define DRM_IOCTL_INTEL_FRAMEBUFFER_SETPARAM DRM_IOW( DRM_COMMAND_BASE + DRM_INTEL_FRAMEBUFFER_SETPARAM, struct intel_framebuffer_param) /* Allow drivers to submit batchbuffers directly to hardware, relying * on the security mechanisms provided by hardware. @@ -997,4 +1001,11 @@ struct drm_i915_gem_userptr { */ __u32 handle; }; + +struct intel_framebuffer_param { + __u32 fb_id; + __u32 param; + __u64 value; +}; + #endif /* _UAPI_I915_DRM_H_ */ -- 1.8.3.1