drm/i915/ttm: Add I915_BO_PREALLOC
authorNirmoy Das <nirmoy.das@intel.com>
Tue, 4 Apr 2023 14:30:56 +0000 (16:30 +0200)
committerNirmoy Das <nirmoy.das@intel.com>
Thu, 6 Apr 2023 16:19:44 +0000 (18:19 +0200)
Add a mechanism to preserve existing data when creating
a TTM object with the I915_BO_ALLOC_USER flag. This will
be used in the subsequent patch where the I915_BO_ALLOC_USER
flag will be applied to the framebuffer object. For a pre-allocated
framebuffer without the I915_BO_PREALLOC flag.

TTM would clear the content, which is not desirable.
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Andi Shyti <andi.shyti@linux.intel.com>
Cc: Andrzej Hajda <andrzej.hajda@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Signed-off-by: Nirmoy Das <nirmoy.das@intel.com>
Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com>
Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230404143100.10452-1-nirmoy.das@intel.com
drivers/gpu/drm/i915/gem/i915_gem_object_types.h
drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c

index 19c9bdd8f905f0cbec9ba3d40fa32334c0efd2b5..8540edff164b34924fbaf67a251be17dc03feeb1 100644 (file)
@@ -328,6 +328,12 @@ struct drm_i915_gem_object {
  */
 #define I915_BO_ALLOC_GPU_ONLY   BIT(6)
 #define I915_BO_ALLOC_CCS_AUX    BIT(7)
+/*
+ * Object is allowed to retain its initial data and will not be cleared on first
+ * access if used along with I915_BO_ALLOC_USER. This is mainly to keep
+ * preallocated framebuffer data intact while transitioning it to i915drmfb.
+ */
+#define I915_BO_PREALLOC         BIT(8)
 #define I915_BO_ALLOC_FLAGS (I915_BO_ALLOC_CONTIGUOUS | \
                             I915_BO_ALLOC_VOLATILE | \
                             I915_BO_ALLOC_CPU_CLEAR | \
@@ -335,10 +341,11 @@ struct drm_i915_gem_object {
                             I915_BO_ALLOC_PM_VOLATILE | \
                             I915_BO_ALLOC_PM_EARLY | \
                             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)
+                            I915_BO_ALLOC_CCS_AUX | \
+                            I915_BO_PREALLOC)
+#define I915_BO_READONLY          BIT(9)
+#define I915_TILING_QUIRK_BIT     10 /* unknown swizzling; do not release! */
+#define I915_BO_PROTECTED         BIT(11)
        /**
         * @mem_flags - Mutable placement-related flags
         *
index 6e3de0f33add9bd21b766a0384f74c5be6ff0b30..46b398ccd2507369e829381cb5fce0478fcdcd78 100644 (file)
@@ -560,7 +560,7 @@ int i915_ttm_move(struct ttm_buffer_object *bo, bool evict,
        struct dma_fence *migration_fence = NULL;
        struct ttm_tt *ttm = bo->ttm;
        struct i915_refct_sgt *dst_rsgt;
-       bool clear;
+       bool clear, prealloc_bo;
        int ret;
 
        if (GEM_WARN_ON(i915_ttm_is_ghost_object(bo))) {
@@ -590,7 +590,8 @@ int i915_ttm_move(struct ttm_buffer_object *bo, bool evict,
                return PTR_ERR(dst_rsgt);
 
        clear = !i915_ttm_cpu_maps_iomem(bo->resource) && (!ttm || !ttm_tt_is_populated(ttm));
-       if (!(clear && ttm && !(ttm->page_flags & TTM_TT_FLAG_ZERO_ALLOC))) {
+       prealloc_bo = obj->flags & I915_BO_PREALLOC;
+       if (!(clear && ttm && !((ttm->page_flags & TTM_TT_FLAG_ZERO_ALLOC) && !prealloc_bo))) {
                struct i915_deps deps;
 
                i915_deps_init(&deps, GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN);