On Thu, Sep 18, 2014 at 04:43:13PM -0300, Gustavo Padovan wrote:
> From: Gustavo Padovan <gustavo.pado...@collabora.co.uk>
> 
> Move checks inside intel_crtc_cursor_set_obj() to
> intel_check_cursor_plane(), we only use they there so move them out to
> make the merge of intel_crtc_cursor_set_obj() into
> intel_check_cursor_plane() easier.
> 
> This is another step toward the atomic modesetting support and unification
> of plane operations such pin/unpin of fb objects on i915.
> 
> Signed-off-by: Gustavo Padovan <gustavo.pado...@collabora.co.uk>
> ---
>  drivers/gpu/drm/i915/intel_display.c | 66 
> ++++++++++++++++++++++++------------
>  1 file changed, 44 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c 
> b/drivers/gpu/drm/i915/intel_display.c
> index 1fd9b70..a68befb 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -8377,7 +8377,7 @@ static int intel_crtc_cursor_set_obj(struct drm_crtc 
> *crtc,
>       struct drm_i915_private *dev_priv = dev->dev_private;
>       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>       enum pipe pipe = intel_crtc->pipe;
> -     unsigned old_width, stride;
> +     unsigned old_width;
>       uint32_t addr;
>       int ret;
>  
> @@ -8389,30 +8389,11 @@ static int intel_crtc_cursor_set_obj(struct drm_crtc 
> *crtc,
>               goto finish;
>       }
>  
> -     /* Check for which cursor types we support */
> -     if (!cursor_size_ok(dev, width, height)) {
> -             DRM_DEBUG("Cursor dimension not supported\n");
> -             return -EINVAL;
> -     }
> -
> -     stride = roundup_pow_of_two(width) * 4;
> -     if (obj->base.size < stride * height) {
> -             DRM_DEBUG_KMS("buffer is too small\n");
> -             ret = -ENOMEM;
> -             goto fail;
> -     }
> -
>       /* we only need to pin inside GTT if cursor is non-phy */
>       mutex_lock(&dev->struct_mutex);
>       if (!INTEL_INFO(dev)->cursor_needs_physical) {
>               unsigned alignment;
>  
> -             if (obj->tiling_mode) {
> -                     DRM_DEBUG_KMS("cursor cannot be tiled\n");
> -                     ret = -EINVAL;
> -                     goto fail_locked;
> -             }

Hmm. I was going to say this check needs to remain here due to
struct_mutex getting dropped between check() and here. But it looks
like these days obj->framebuffer_references should protect us from
anyone changing the tiling mode while the object is wrapped in
framebuffer. So seems moving it should still work fine.

> -
>               /*
>                * Global gtt pte registers are special registers which actually
>                * forward writes to a chunk of system memory. Which means that
> @@ -8488,7 +8469,6 @@ fail_unpin:
>       i915_gem_object_unpin_from_display_plane(obj);
>  fail_locked:
>       mutex_unlock(&dev->struct_mutex);
> -fail:
>       drm_gem_object_unreference_unlocked(&obj->base);

That unref looks like a leftover from the days before universal
planes. Should be just removed AFAICS and the stale comments about
reference consumption should be removed. Please send a separate patch
for this stuff.

>       return ret;
>  }
> @@ -12039,16 +12019,58 @@ intel_check_cursor_plane(struct drm_plane *plane,
>                        struct intel_plane_state *state)
>  {
>       struct drm_crtc *crtc = state->crtc;
> +     struct drm_device *dev = crtc->dev;
>       struct drm_framebuffer *fb = state->fb;
>       struct drm_rect *dest = &state->dst;
>       struct drm_rect *src = &state->src;
>       const struct drm_rect *clip = &state->clip;
> +     struct drm_i915_gem_object *obj = intel_fb_obj(fb);
> +     int crtc_w, crtc_h;
> +     unsigned stride;
> +     int ret;
>  
> -     return drm_plane_helper_check_update(plane, crtc, fb,
> +     ret = drm_plane_helper_check_update(plane, crtc, fb,
>                                           src, dest, clip,
>                                           DRM_PLANE_HELPER_NO_SCALING,
>                                           DRM_PLANE_HELPER_NO_SCALING,
>                                           true, true, &state->visible);
> +     if (ret)
> +             return ret;
> +
> +     crtc_w = drm_rect_width(&state->orig_dst);
> +     crtc_h = drm_rect_height(&state->orig_dst);

Could move these a bit later since they're not needed immediately.

> +
> +     /* if we want to turn off the cursor ignore width and height */
> +     if (!obj)
> +             return 0;
> +
> +     if (fb == crtc->cursor->fb)
> +             return 0;
> +
> +     /* Check for which cursor types we support */
> +     if (!cursor_size_ok(dev, crtc_w, crtc_h)) {
> +             DRM_DEBUG("Cursor dimension not supported\n");
> +             return -EINVAL;
> +     }
> +
> +     stride = roundup_pow_of_two(crtc_w) * 4;
> +     if (obj->base.size < stride * crtc_h) {
> +             DRM_DEBUG_KMS("buffer is too small\n");
> +             ret = -ENOMEM;
> +             goto fail;
> +     }
> +
> +     /* we only need to pin inside GTT if cursor is non-phy */
> +     mutex_lock(&dev->struct_mutex);
> +     if (!INTEL_INFO(dev)->cursor_needs_physical && obj->tiling_mode) {
> +             DRM_DEBUG_KMS("cursor cannot be tiled\n");
> +             ret = -EINVAL;
> +     }
> +     mutex_unlock(&dev->struct_mutex);
> +
> +fail:
> +     drm_gem_object_unreference_unlocked(&obj->base);

and this bug should not get copied here.

> +     return ret;
>  }
>  
>  static int
> -- 
> 1.9.3
> 
> _______________________________________________
> dri-devel mailing list
> dri-de...@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Ville Syrjälä
Intel OTC
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to