drm/i915/ttm: consider CCS for backup objects
authorjsg <jsg@openbsd.org>
Mon, 9 Jan 2023 04:13:33 +0000 (04:13 +0000)
committerjsg <jsg@openbsd.org>
Mon, 9 Jan 2023 04:13:33 +0000 (04:13 +0000)
From Matthew Auld
218f8fe668240f2ec95dcb000f61904dcdc83271 in linux-6.1.y/6.1.4
ad0fca2dceeab8fdd8e1135f4b4ef2dc46c2ead9 in mainline linux

sys/dev/pci/drm/i915/gem/i915_gem_object.c
sys/dev/pci/drm/i915/gem/i915_gem_object_types.h
sys/dev/pci/drm/i915/gem/i915_gem_ttm_pm.c

index b690bbd..02ac8aa 100644 (file)
@@ -777,6 +777,9 @@ bool i915_gem_object_needs_ccs_pages(struct drm_i915_gem_object *obj)
        if (!HAS_FLAT_CCS(to_i915(obj->base.dev)))
                return false;
 
+       if (obj->flags & I915_BO_ALLOC_CCS_AUX)
+               return true;
+
        for (i = 0; i < obj->mm.n_placements; i++) {
                /* Compression is not allowed for the objects with smem placement */
                if (obj->mm.placements[i]->type == INTEL_MEMORY_SYSTEM)
index 1878eed..13effa9 100644 (file)
@@ -327,16 +327,18 @@ struct drm_i915_gem_object {
  * dealing with userspace objects the CPU fault handler is free to ignore this.
  */
 #define I915_BO_ALLOC_GPU_ONLY   BIT(6)
+#define I915_BO_ALLOC_CCS_AUX    BIT(7)
 #define I915_BO_ALLOC_FLAGS (I915_BO_ALLOC_CONTIGUOUS | \
                             I915_BO_ALLOC_VOLATILE | \
                             I915_BO_ALLOC_CPU_CLEAR | \
                             I915_BO_ALLOC_USER | \
                             I915_BO_ALLOC_PM_VOLATILE | \
                             I915_BO_ALLOC_PM_EARLY | \
-                            I915_BO_ALLOC_GPU_ONLY)
-#define I915_BO_READONLY          BIT(7)
-#define I915_TILING_QUIRK_BIT     8 /* unknown swizzling; do not release! */
-#define I915_BO_PROTECTED         BIT(9)
+                            I915_BO_ALLOC_GPU_ONLY | \
+                            I915_BO_ALLOC_CCS_AUX)
+#define I915_BO_READONLY          BIT(8)
+#define I915_TILING_QUIRK_BIT     9 /* unknown swizzling; do not release! */
+#define I915_BO_PROTECTED         BIT(10)
        /**
         * @mem_flags - Mutable placement-related flags
         *
index 07e49f2..7e67742 100644 (file)
@@ -50,6 +50,7 @@ static int i915_ttm_backup(struct i915_gem_apply_to_region *apply,
                container_of(bo->bdev, typeof(*i915), bdev);
        struct drm_i915_gem_object *backup;
        struct ttm_operation_ctx ctx = {};
+       unsigned int flags;
        int err = 0;
 
        if (bo->resource->mem_type == I915_PL_SYSTEM || obj->ttm.backup)
@@ -65,7 +66,22 @@ static int i915_ttm_backup(struct i915_gem_apply_to_region *apply,
        if (obj->flags & I915_BO_ALLOC_PM_VOLATILE)
                return 0;
 
-       backup = i915_gem_object_create_shmem(i915, obj->base.size);
+       /*
+        * It seems that we might have some framebuffers still pinned at this
+        * stage, but for such objects we might also need to deal with the CCS
+        * aux state. Make sure we force the save/restore of the CCS state,
+        * otherwise we might observe display corruption, when returning from
+        * suspend.
+        */
+       flags = 0;
+       if (i915_gem_object_needs_ccs_pages(obj)) {
+               WARN_ON_ONCE(!i915_gem_object_is_framebuffer(obj));
+               WARN_ON_ONCE(!pm_apply->allow_gpu);
+
+               flags = I915_BO_ALLOC_CCS_AUX;
+       }
+       backup = i915_gem_object_create_region(i915->mm.regions[INTEL_REGION_SMEM],
+                                              obj->base.size, 0, flags);
        if (IS_ERR(backup))
                return PTR_ERR(backup);