#include "gem/i915_gem_ttm.h"
 #include "gem/i915_gem_ttm_move.h"
 #include "gem/i915_gem_ttm_pm.h"
+#include "gt/intel_gpu_commands.h"
 
 #define I915_TTM_PRIO_PURGE     0
 #define I915_TTM_PRIO_NO_PAGES  1
        .release = i915_ttm_tt_release
 };
 
+static inline bool
+i915_gem_object_needs_ccs_pages(struct drm_i915_gem_object *obj)
+{
+       bool lmem_placement = false;
+       int i;
+
+       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)
+                       return false;
+               if (!lmem_placement &&
+                   obj->mm.placements[i]->type == INTEL_MEMORY_LOCAL)
+                       lmem_placement = true;
+       }
+
+       return lmem_placement;
+}
+
 static struct ttm_tt *i915_ttm_tt_create(struct ttm_buffer_object *bo,
                                         uint32_t page_flags)
 {
+       struct drm_i915_private *i915 = container_of(bo->bdev, typeof(*i915),
+                                                    bdev);
        struct ttm_resource_manager *man =
                ttm_manager_type(bo->bdev, bo->resource->mem_type);
        struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo);
+       unsigned long ccs_pages = 0;
        enum ttm_caching caching;
        struct i915_ttm_tt *i915_tt;
        int ret;
                i915_tt->is_shmem = true;
        }
 
-       ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching, 0);
+       if (HAS_FLAT_CCS(i915) && i915_gem_object_needs_ccs_pages(obj))
+               ccs_pages = DIV_ROUND_UP(DIV_ROUND_UP(bo->base.size,
+                                                     NUM_BYTES_PER_CCS_BYTE),
+                                        PAGE_SIZE);
+
+       ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching, ccs_pages);
        if (ret)
                goto err_free;
 
                                            i915_sg_dma_sizes(rsgt->table.sgl));
        }
 
+       GEM_BUG_ON(bo->ttm && ((obj->base.size >> PAGE_SHIFT) < bo->ttm->num_pages));
        i915_ttm_adjust_lru(obj);
        return ret;
 }