drm/i915: Move non-phys cursors into the GTT

Cursors need to be in the GTT domain when being accessed by the GPU.
Previously this was a fortuitous byproduct of userspace using pwrite()
to upload the image data into the cursor. The redundant clflush was
removed in commit 9b8c4a and so the image was no longer being flushed
out of the caches into main memory. One could also devise a scenario
where the cursor was rendered by the GPU, prior to being attached as the
cursor, resulting in similar corruption due to the missing MI_FLUSH.

Fixes:

Bug 28335 - Cursor corruption caused by commit 9b8c4a0b21
https://bugs.freedesktop.org/show_bug.cgi?id=28335

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reported-and-tested-by: Jeff Chua <jeff.chua.linux@gmail.com>
Tested-by: Linus Torvalds <torvalds@linux-foundation.org>
Reported-by: Andy Isaacson <adi@hexapodia.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Chris Wilson and committed by
Linus Torvalds
e7b526bb 78b36558

+9
+9
drivers/gpu/drm/i915/intel_display.c
··· 3973 3973 DRM_ERROR("failed to pin cursor bo\n"); 3974 3974 goto fail_locked; 3975 3975 } 3976 + 3977 + ret = i915_gem_object_set_to_gtt_domain(bo, 0); 3978 + if (ret) { 3979 + DRM_ERROR("failed to move cursor bo into the GTT\n"); 3980 + goto fail_unpin; 3981 + } 3982 + 3976 3983 addr = obj_priv->gtt_offset; 3977 3984 } else { 3978 3985 ret = i915_gem_attach_phys_object(dev, bo, (pipe == 0) ? I915_GEM_PHYS_CURSOR_0 : I915_GEM_PHYS_CURSOR_1); ··· 4023 4016 intel_crtc->cursor_bo = bo; 4024 4017 4025 4018 return 0; 4019 + fail_unpin: 4020 + i915_gem_object_unpin(bo); 4026 4021 fail_locked: 4027 4022 mutex_unlock(&dev->struct_mutex); 4028 4023 fail: