[Intel-gfx] [PATCH 1/2] drm/i915: Kill DRI1 cliprects
Daniel Vetter
daniel at ffwll.ch
Tue Oct 6 04:21:25 PDT 2015
On Tue, Oct 06, 2015 at 11:39:55AM +0100, Chris Wilson wrote:
> Passing cliprects into the kernel for it to re-execute the batch buffer
> with different CMD_DRAWRECT died out long ago. As DRI1 support has been
> removed from the kernel, we can now simply reject any execbuf trying to
> use this "feature".
>
> To keep Daniel happy with the prospect of being able to reuse these
> fields in the next decade, continue to ensure that current userspace is
> not passing garbage in through the dead fields.
>
> v2: Fix the cliprects_ptr check
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
igt subtest seems to be missing to ensure we enforce this. Yay otherwise!
-Daniel
> ---
> drivers/gpu/drm/i915/i915_gem_execbuffer.c | 154 ++++++-----------------------
> drivers/gpu/drm/i915/intel_lrc.c | 15 ---
> 2 files changed, 31 insertions(+), 138 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> index 75a0c8b5305b..045a7631faa0 100644
> --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> @@ -947,7 +947,21 @@ i915_gem_check_execbuffer(struct drm_i915_gem_execbuffer2 *exec)
> if (exec->flags & __I915_EXEC_UNKNOWN_FLAGS)
> return false;
>
> - return ((exec->batch_start_offset | exec->batch_len) & 0x7) == 0;
> + /* Kernel clipping was a DRI1 misfeature */
> + if (exec->num_cliprects || exec->cliprects_ptr)
> + return false;
> +
> + if (exec->DR4 == 0xffffffff) {
> + DRM_DEBUG("UXA submitting garbage DR4, fixing up\n");
> + exec->DR4 = 0;
> + }
> + if (exec->DR1 || exec->DR4)
> + return false;
> +
> + if ((exec->batch_start_offset | exec->batch_len) & 0x7)
> + return false;
> +
> + return true;
> }
>
> static int
> @@ -1111,47 +1125,6 @@ i915_reset_gen7_sol_offsets(struct drm_device *dev,
> return 0;
> }
>
> -static int
> -i915_emit_box(struct drm_i915_gem_request *req,
> - struct drm_clip_rect *box,
> - int DR1, int DR4)
> -{
> - struct intel_engine_cs *ring = req->ring;
> - int ret;
> -
> - if (box->y2 <= box->y1 || box->x2 <= box->x1 ||
> - box->y2 <= 0 || box->x2 <= 0) {
> - DRM_ERROR("Bad box %d,%d..%d,%d\n",
> - box->x1, box->y1, box->x2, box->y2);
> - return -EINVAL;
> - }
> -
> - if (INTEL_INFO(ring->dev)->gen >= 4) {
> - ret = intel_ring_begin(req, 4);
> - if (ret)
> - return ret;
> -
> - intel_ring_emit(ring, GFX_OP_DRAWRECT_INFO_I965);
> - intel_ring_emit(ring, (box->x1 & 0xffff) | box->y1 << 16);
> - intel_ring_emit(ring, ((box->x2 - 1) & 0xffff) | (box->y2 - 1) << 16);
> - intel_ring_emit(ring, DR4);
> - } else {
> - ret = intel_ring_begin(req, 6);
> - if (ret)
> - return ret;
> -
> - intel_ring_emit(ring, GFX_OP_DRAWRECT_INFO);
> - intel_ring_emit(ring, DR1);
> - intel_ring_emit(ring, (box->x1 & 0xffff) | box->y1 << 16);
> - intel_ring_emit(ring, ((box->x2 - 1) & 0xffff) | (box->y2 - 1) << 16);
> - intel_ring_emit(ring, DR4);
> - intel_ring_emit(ring, 0);
> - }
> - intel_ring_advance(ring);
> -
> - return 0;
> -}
> -
> static struct drm_i915_gem_object*
> i915_gem_execbuffer_parse(struct intel_engine_cs *ring,
> struct drm_i915_gem_exec_object2 *shadow_exec_entry,
> @@ -1210,65 +1183,21 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
> struct drm_i915_gem_execbuffer2 *args,
> struct list_head *vmas)
> {
> - struct drm_clip_rect *cliprects = NULL;
> struct drm_device *dev = params->dev;
> struct intel_engine_cs *ring = params->ring;
> struct drm_i915_private *dev_priv = dev->dev_private;
> u64 exec_start, exec_len;
> int instp_mode;
> u32 instp_mask;
> - int i, ret = 0;
> -
> - if (args->num_cliprects != 0) {
> - if (ring != &dev_priv->ring[RCS]) {
> - DRM_DEBUG("clip rectangles are only valid with the render ring\n");
> - return -EINVAL;
> - }
> -
> - if (INTEL_INFO(dev)->gen >= 5) {
> - DRM_DEBUG("clip rectangles are only valid on pre-gen5\n");
> - return -EINVAL;
> - }
> -
> - if (args->num_cliprects > UINT_MAX / sizeof(*cliprects)) {
> - DRM_DEBUG("execbuf with %u cliprects\n",
> - args->num_cliprects);
> - return -EINVAL;
> - }
> -
> - cliprects = kcalloc(args->num_cliprects,
> - sizeof(*cliprects),
> - GFP_KERNEL);
> - if (cliprects == NULL) {
> - ret = -ENOMEM;
> - goto error;
> - }
> -
> - if (copy_from_user(cliprects,
> - to_user_ptr(args->cliprects_ptr),
> - sizeof(*cliprects)*args->num_cliprects)) {
> - ret = -EFAULT;
> - goto error;
> - }
> - } else {
> - if (args->DR4 == 0xffffffff) {
> - DRM_DEBUG("UXA submitting garbage DR4, fixing up\n");
> - args->DR4 = 0;
> - }
> -
> - if (args->DR1 || args->DR4 || args->cliprects_ptr) {
> - DRM_DEBUG("0 cliprects but dirt in cliprects fields\n");
> - return -EINVAL;
> - }
> - }
> + int ret;
>
> ret = i915_gem_execbuffer_move_to_gpu(params->request, vmas);
> if (ret)
> - goto error;
> + return ret;
>
> ret = i915_switch_context(params->request);
> if (ret)
> - goto error;
> + return ret;
>
> WARN(params->ctx->ppgtt && params->ctx->ppgtt->pd_dirty_rings & (1<<ring->id),
> "%s didn't clear reload\n", ring->name);
> @@ -1281,22 +1210,19 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
> case I915_EXEC_CONSTANTS_REL_SURFACE:
> if (instp_mode != 0 && ring != &dev_priv->ring[RCS]) {
> DRM_DEBUG("non-0 rel constants mode on non-RCS\n");
> - ret = -EINVAL;
> - goto error;
> + return -EINVAL;
> }
>
> if (instp_mode != dev_priv->relative_constants_mode) {
> if (INTEL_INFO(dev)->gen < 4) {
> DRM_DEBUG("no rel constants on pre-gen4\n");
> - ret = -EINVAL;
> - goto error;
> + return -EINVAL;
> }
>
> if (INTEL_INFO(dev)->gen > 5 &&
> instp_mode == I915_EXEC_CONSTANTS_REL_SURFACE) {
> DRM_DEBUG("rel surface constants mode invalid on gen5+\n");
> - ret = -EINVAL;
> - goto error;
> + return -EINVAL;
> }
>
> /* The HW changed the meaning on this bit on gen6 */
> @@ -1306,15 +1232,14 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
> break;
> default:
> DRM_DEBUG("execbuf with unknown constants: %d\n", instp_mode);
> - ret = -EINVAL;
> - goto error;
> + return -EINVAL;
> }
>
> if (ring == &dev_priv->ring[RCS] &&
> - instp_mode != dev_priv->relative_constants_mode) {
> + instp_mode != dev_priv->relative_constants_mode) {
> ret = intel_ring_begin(params->request, 4);
> if (ret)
> - goto error;
> + return ret;
>
> intel_ring_emit(ring, MI_NOOP);
> intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
> @@ -1328,42 +1253,25 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
> if (args->flags & I915_EXEC_GEN7_SOL_RESET) {
> ret = i915_reset_gen7_sol_offsets(dev, params->request);
> if (ret)
> - goto error;
> + return ret;
> }
>
> exec_len = args->batch_len;
> exec_start = params->batch_obj_vm_offset +
> params->args_batch_start_offset;
>
> - if (cliprects) {
> - for (i = 0; i < args->num_cliprects; i++) {
> - ret = i915_emit_box(params->request, &cliprects[i],
> - args->DR1, args->DR4);
> - if (ret)
> - goto error;
> -
> - ret = ring->dispatch_execbuffer(params->request,
> - exec_start, exec_len,
> - params->dispatch_flags);
> - if (ret)
> - goto error;
> - }
> - } else {
> - ret = ring->dispatch_execbuffer(params->request,
> - exec_start, exec_len,
> - params->dispatch_flags);
> - if (ret)
> - return ret;
> - }
> + ret = ring->dispatch_execbuffer(params->request,
> + exec_start, exec_len,
> + params->dispatch_flags);
> + if (ret)
> + return ret;
>
> trace_i915_gem_ring_dispatch(params->request, params->dispatch_flags);
>
> i915_gem_execbuffer_move_to_active(vmas, params->request);
> i915_gem_execbuffer_retire_commands(params);
>
> -error:
> - kfree(cliprects);
> - return ret;
> + return 0;
> }
>
> /**
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index 78aab946db04..d38746c5370d 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -878,21 +878,6 @@ int intel_execlists_submission(struct i915_execbuffer_params *params,
> return -EINVAL;
> }
>
> - if (args->num_cliprects != 0) {
> - DRM_DEBUG("clip rectangles are only valid on pre-gen5\n");
> - return -EINVAL;
> - } else {
> - if (args->DR4 == 0xffffffff) {
> - DRM_DEBUG("UXA submitting garbage DR4, fixing up\n");
> - args->DR4 = 0;
> - }
> -
> - if (args->DR1 || args->DR4 || args->cliprects_ptr) {
> - DRM_DEBUG("0 cliprects but dirt in cliprects fields\n");
> - return -EINVAL;
> - }
> - }
> -
> if (args->flags & I915_EXEC_GEN7_SOL_RESET) {
> DRM_DEBUG("sol reset is gen7 only\n");
> return -EINVAL;
> --
> 2.6.0
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
More information about the Intel-gfx
mailing list