[Intel-gfx] [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 14:11:59 CEST 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 Intel-gfx
mailing list