drm/i915: Fix i915_ggtt_view_equal to handle rotation correctly
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 14 Oct 2015 14:51:06 +0000 (16:51 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 19 Nov 2015 15:42:06 +0000 (16:42 +0100)
The rotated view depends upon the rotation paramters, but thus far we
didn't bother checking for those. This seems to have been an issue
ever since this was introduce in

commit fe14d5f4e5468c5b80a24f1a64abcbe116143670
Author: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Date:   Wed Dec 10 17:27:58 2014 +0000

    drm/i915: Infrastructure for supporting different GGTT views per object

But userspace is allowed to reuse framebuffer backing storage with
different framebuffers with different pixel formats/stride/whatever.
And e.g. SNA indeed does this. Hence we must check for all the
paramters to match, not just that it's rotated.

v2: intel_plane_obj_offset also needs to construct the full view, to
avoid fallout since they don't fully match.

Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1444834266-12689-3-git-send-email-daniel.vetter@ffwll.ch
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_gem_gtt.h
drivers/gpu/drm/i915/intel_display.c

index 310f212a321c668933fec11ef5629cb64113d119..877c32c78a6a6f11c5fe38687c88a313becdb2bb 100644 (file)
@@ -553,7 +553,7 @@ i915_ggtt_view_equal(const struct i915_ggtt_view *a,
 
        if (a->type != b->type)
                return false;
-       if (a->type == I915_GGTT_VIEW_PARTIAL)
+       if (a->type != I915_GGTT_VIEW_NORMAL)
                return !memcmp(&a->params, &b->params, sizeof(a->params));
        return true;
 }
index 4712cca76979e5792307ca8243fc64869afa2fa3..f6a66670bb1cb8c1f3872fc2523652e7a50e3cae 100644 (file)
@@ -2914,16 +2914,16 @@ u32 intel_plane_obj_offset(struct intel_plane *intel_plane,
                           struct drm_i915_gem_object *obj,
                           unsigned int plane)
 {
-       const struct i915_ggtt_view *view = &i915_ggtt_view_normal;
+       struct i915_ggtt_view view;
        struct i915_vma *vma;
        u64 offset;
 
-       if (intel_rotation_90_or_270(intel_plane->base.state->rotation))
-               view = &i915_ggtt_view_rotated;
+       intel_fill_fb_ggtt_view(&view, intel_plane->base.fb,
+                               intel_plane->base.state);
 
-       vma = i915_gem_obj_to_ggtt_view(obj, view);
+       vma = i915_gem_obj_to_ggtt_view(obj, &view);
        if (WARN(!vma, "ggtt vma for display object not found! (view=%u)\n",
-               view->type))
+               view.type))
                return -1;
 
        offset = vma->node.start;