]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915/gtt/xehpsdv: move scratch page to system memory
authorMatthew Auld <matthew.auld@intel.com>
Wed, 8 Dec 2021 14:16:12 +0000 (19:46 +0530)
committerRamalingam C <ramalingam.c@intel.com>
Thu, 9 Dec 2021 16:39:29 +0000 (22:09 +0530)
On some platforms the hw has dropped support for 4K GTT pages when
dealing with LMEM, and due to the design of 64K GTT pages in the hw, we
can only mark the *entire* page-table as operating in 64K GTT mode,
since the enable bit is still on the pde, and not the pte. And since we
we still need to allow 4K GTT pages for SMEM objects, we can't have a
"normal" 4K page-table with scratch pointing to LMEM, since that's
undefined from the hw pov. The simplest solution is to just move the 64K
scratch page to SMEM on such platforms and call it a day, since that
should work for all configurations.

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
Reviewed-by: Thomas Hellstrom <thomas.hellstrom@linux.intel.com>
Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211208141613.7251-4-ramalingam.c@intel.com
drivers/gpu/drm/i915/gt/gen6_ppgtt.c
drivers/gpu/drm/i915/gt/gen8_ppgtt.c
drivers/gpu/drm/i915/gt/intel_ggtt.c
drivers/gpu/drm/i915/gt/intel_gtt.c
drivers/gpu/drm/i915/gt/intel_gtt.h
drivers/gpu/drm/i915/selftests/mock_gtt.c

index 4a166d25fe60255c5f13cd79e33c9b6ee71ebe74..c0d149f049499858210355449c48948d890ccdeb 100644 (file)
@@ -454,6 +454,7 @@ struct i915_ppgtt *gen6_ppgtt_create(struct intel_gt *gt)
        ppgtt->base.vm.cleanup = gen6_ppgtt_cleanup;
 
        ppgtt->base.vm.alloc_pt_dma = alloc_pt_dma;
+       ppgtt->base.vm.alloc_scratch_dma = alloc_pt_dma;
        ppgtt->base.vm.pte_encode = ggtt->vm.pte_encode;
 
        err = gen6_ppgtt_init_scratch(ppgtt);
index 95c02096a61bb62743c7dc928b082d90fe61019e..b012c50f7ce7871c655af9e4e9051867f94371dc 100644 (file)
@@ -776,10 +776,29 @@ struct i915_ppgtt *gen8_ppgtt_create(struct intel_gt *gt,
         */
        ppgtt->vm.has_read_only = !IS_GRAPHICS_VER(gt->i915, 11, 12);
 
-       if (HAS_LMEM(gt->i915))
+       if (HAS_LMEM(gt->i915)) {
                ppgtt->vm.alloc_pt_dma = alloc_pt_lmem;
-       else
+
+               /*
+                * On some platforms the hw has dropped support for 4K GTT pages
+                * when dealing with LMEM, and due to the design of 64K GTT
+                * pages in the hw, we can only mark the *entire* page-table as
+                * operating in 64K GTT mode, since the enable bit is still on
+                * the pde, and not the pte. And since we still need to allow
+                * 4K GTT pages for SMEM objects, we can't have a "normal" 4K
+                * page-table with scratch pointing to LMEM, since that's
+                * undefined from the hw pov. The simplest solution is to just
+                * move the 64K scratch page to SMEM on such platforms and call
+                * it a day, since that should work for all configurations.
+                */
+               if (HAS_64K_PAGES(gt->i915))
+                       ppgtt->vm.alloc_scratch_dma = alloc_pt_dma;
+               else
+                       ppgtt->vm.alloc_scratch_dma = alloc_pt_lmem;
+       } else {
                ppgtt->vm.alloc_pt_dma = alloc_pt_dma;
+               ppgtt->vm.alloc_scratch_dma = alloc_pt_dma;
+       }
 
        err = gen8_init_scratch(&ppgtt->vm);
        if (err)
index 7a85d658b08d43472331715ba36243bc93e19a09..60b9b8b73758da40148b3c122c649e6c0c05c1d2 100644 (file)
@@ -924,6 +924,7 @@ static int gen8_gmch_probe(struct i915_ggtt *ggtt)
                size = gen8_get_total_gtt_size(snb_gmch_ctl);
 
        ggtt->vm.alloc_pt_dma = alloc_pt_dma;
+       ggtt->vm.alloc_scratch_dma = alloc_pt_dma;
        ggtt->vm.lmem_pt_obj_flags = I915_BO_ALLOC_PM_EARLY;
 
        ggtt->vm.total = (size / sizeof(gen8_pte_t)) * I915_GTT_PAGE_SIZE;
@@ -1077,6 +1078,7 @@ static int gen6_gmch_probe(struct i915_ggtt *ggtt)
        ggtt->vm.total = (size / sizeof(gen6_pte_t)) * I915_GTT_PAGE_SIZE;
 
        ggtt->vm.alloc_pt_dma = alloc_pt_dma;
+       ggtt->vm.alloc_scratch_dma = alloc_pt_dma;
 
        ggtt->vm.clear_range = nop_clear_range;
        if (!HAS_FULL_PPGTT(i915) || intel_scanout_needs_vtd_wa(i915))
@@ -1129,6 +1131,7 @@ static int i915_gmch_probe(struct i915_ggtt *ggtt)
                (struct resource)DEFINE_RES_MEM(gmadr_base, ggtt->mappable_end);
 
        ggtt->vm.alloc_pt_dma = alloc_pt_dma;
+       ggtt->vm.alloc_scratch_dma = alloc_pt_dma;
 
        if (needs_idle_maps(i915)) {
                drm_notice(&i915->drm,
index 0dd254cb1f69d75e291db2fae395f44372c6b697..1428e2b9075a2de4cb3e572d7f28d5ba27dae78d 100644 (file)
@@ -301,7 +301,7 @@ int setup_scratch_page(struct i915_address_space *vm)
        do {
                struct drm_i915_gem_object *obj;
 
-               obj = vm->alloc_pt_dma(vm, size);
+               obj = vm->alloc_scratch_dma(vm, size);
                if (IS_ERR(obj))
                        goto skip;
 
index d8377ed59636fc7ad335c65efe867afcd66f12ca..a27d57e1c7ebfd97205a4fb77fd19021a4b7406f 100644 (file)
@@ -268,6 +268,8 @@ struct i915_address_space {
 
        struct drm_i915_gem_object *
                (*alloc_pt_dma)(struct i915_address_space *vm, int sz);
+       struct drm_i915_gem_object *
+               (*alloc_scratch_dma)(struct i915_address_space *vm, int sz);
 
        u64 (*pte_encode)(dma_addr_t addr,
                          enum i915_cache_level level,
index cc047ec594f93e0fd89c88cecdfb5e8f93d2ca6e..32ca8962d0abdedfce78f2865030d9fe2f14cec4 100644 (file)
@@ -78,6 +78,7 @@ struct i915_ppgtt *mock_ppgtt(struct drm_i915_private *i915, const char *name)
        i915_address_space_init(&ppgtt->vm, VM_CLASS_PPGTT);
 
        ppgtt->vm.alloc_pt_dma = alloc_pt_dma;
+       ppgtt->vm.alloc_scratch_dma = alloc_pt_dma;
 
        ppgtt->vm.clear_range = mock_clear_range;
        ppgtt->vm.insert_page = mock_insert_page;
@@ -118,6 +119,7 @@ void mock_init_ggtt(struct drm_i915_private *i915, struct i915_ggtt *ggtt)
        ggtt->vm.total = 4096 * PAGE_SIZE;
 
        ggtt->vm.alloc_pt_dma = alloc_pt_dma;
+       ggtt->vm.alloc_scratch_dma = alloc_pt_dma;
 
        ggtt->vm.clear_range = mock_clear_range;
        ggtt->vm.insert_page = mock_insert_page;