[PATCH 2/5] drm/i915: move checks of intel_crtc_cursor_set_obj() out

Ville Syrjälä ville.syrjala at linux.intel.com
Fri Sep 19 05:11:59 PDT 2014


On Thu, Sep 18, 2014 at 04:43:13PM -0300, Gustavo Padovan wrote:
> From: Gustavo Padovan <gustavo.padovan at 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.padovan at 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-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Ville Syrjälä
Intel OTC


More information about the dri-devel mailing list