drm/i915: Fix display problems after resume
authorThomas Hellström <thomas.hellstrom@linux.intel.com>
Wed, 5 Oct 2022 12:11:59 +0000 (14:11 +0200)
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>
Tue, 11 Oct 2022 13:55:32 +0000 (14:55 +0100)
Commit 39a2bd34c933 ("drm/i915: Use the vma resource as argument for gtt
binding / unbinding") introduced a regression that due to the vma resource
tracking of the binding state, dpt ptes were not correctly repopulated.
Fix this by clearing the vma resource state before repopulating.
The state will subsequently be restored by the bind_vma operation.

Fixes: 39a2bd34c933 ("drm/i915: Use the vma resource as argument for gtt binding / unbinding")
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220912121957.31310-1-thomas.hellstrom@linux.intel.com
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: intel-gfx@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v5.18+
Reported-and-tested-by: Kevin Boulain <kevinboulain@gmail.com>
Tested-by: David de Sousa <davidesousa@gmail.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com>
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221005121159.340245-1-thomas.hellstrom@linux.intel.com
(cherry picked from commit bc2472538c0d1cce334ffc9e97df0614cd2b1469)
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
drivers/gpu/drm/i915/gt/intel_ggtt.c

index 30cf5c3369d9fabcbc00fd51ea4c1d16d0dfcc56..2049a00417afad506b0c92b55bcc8c5a8185b521 100644 (file)
@@ -1275,10 +1275,16 @@ bool i915_ggtt_resume_vm(struct i915_address_space *vm)
                        atomic_read(&vma->flags) & I915_VMA_BIND_MASK;
 
                GEM_BUG_ON(!was_bound);
-               if (!retained_ptes)
+               if (!retained_ptes) {
+                       /*
+                        * Clear the bound flags of the vma resource to allow
+                        * ptes to be repopulated.
+                        */
+                       vma->resource->bound_flags = 0;
                        vma->ops->bind_vma(vm, NULL, vma->resource,
                                           obj ? obj->cache_level : 0,
                                           was_bound);
+               }
                if (obj) { /* only used during resume => exclusive access */
                        write_domain_objs |= fetch_and_zero(&obj->write_domain);
                        obj->read_domains |= I915_GEM_DOMAIN_GTT;