Skip to content

Commit 6f84aa1

Browse files
matt-auldlucasdemarchi
authored andcommitted
drm/i915/gtt: add xehpsdv_ppgtt_insert_entry
If this is LMEM then we get a 32 entry PT, with each PTE pointing to some 64K block of memory, otherwise it's just the usual 512 entry PT. This very much assumes the caller knows what they are doing. Signed-off-by: Matthew Auld <[email protected]> Cc: Thomas Hellström <[email protected]> Cc: Ramalingam C <[email protected]> Reviewed-by: Ramalingam C <[email protected]> Signed-off-by: Lucas De Marchi <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 2cff4b9 commit 6f84aa1

File tree

1 file changed

+48
-2
lines changed

1 file changed

+48
-2
lines changed

drivers/gpu/drm/i915/gt/gen8_ppgtt.c

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -715,13 +715,56 @@ static void gen8_ppgtt_insert_entry(struct i915_address_space *vm,
715715
gen8_pdp_for_page_index(vm, idx);
716716
struct i915_page_directory *pd =
717717
i915_pd_entry(pdp, gen8_pd_index(idx, 2));
718+
struct i915_page_table *pt = i915_pt_entry(pd, gen8_pd_index(idx, 1));
718719
gen8_pte_t *vaddr;
719720

720-
vaddr = px_vaddr(i915_pt_entry(pd, gen8_pd_index(idx, 1)));
721+
GEM_BUG_ON(pt->is_compact);
722+
723+
vaddr = px_vaddr(pt);
721724
vaddr[gen8_pd_index(idx, 0)] = gen8_pte_encode(addr, level, flags);
722725
clflush_cache_range(&vaddr[gen8_pd_index(idx, 0)], sizeof(*vaddr));
723726
}
724727

728+
static void __xehpsdv_ppgtt_insert_entry_lm(struct i915_address_space *vm,
729+
dma_addr_t addr,
730+
u64 offset,
731+
enum i915_cache_level level,
732+
u32 flags)
733+
{
734+
u64 idx = offset >> GEN8_PTE_SHIFT;
735+
struct i915_page_directory * const pdp =
736+
gen8_pdp_for_page_index(vm, idx);
737+
struct i915_page_directory *pd =
738+
i915_pd_entry(pdp, gen8_pd_index(idx, 2));
739+
struct i915_page_table *pt = i915_pt_entry(pd, gen8_pd_index(idx, 1));
740+
gen8_pte_t *vaddr;
741+
742+
GEM_BUG_ON(!IS_ALIGNED(addr, SZ_64K));
743+
GEM_BUG_ON(!IS_ALIGNED(offset, SZ_64K));
744+
745+
if (!pt->is_compact) {
746+
vaddr = px_vaddr(pd);
747+
vaddr[gen8_pd_index(idx, 1)] |= GEN12_PDE_64K;
748+
pt->is_compact = true;
749+
}
750+
751+
vaddr = px_vaddr(pt);
752+
vaddr[gen8_pd_index(idx, 0) / 16] = gen8_pte_encode(addr, level, flags);
753+
}
754+
755+
static void xehpsdv_ppgtt_insert_entry(struct i915_address_space *vm,
756+
dma_addr_t addr,
757+
u64 offset,
758+
enum i915_cache_level level,
759+
u32 flags)
760+
{
761+
if (flags & PTE_LM)
762+
return __xehpsdv_ppgtt_insert_entry_lm(vm, addr, offset,
763+
level, flags);
764+
765+
return gen8_ppgtt_insert_entry(vm, addr, offset, level, flags);
766+
}
767+
725768
static int gen8_init_scratch(struct i915_address_space *vm)
726769
{
727770
u32 pte_flags;
@@ -921,7 +964,10 @@ struct i915_ppgtt *gen8_ppgtt_create(struct intel_gt *gt,
921964

922965
ppgtt->vm.bind_async_flags = I915_VMA_LOCAL_BIND;
923966
ppgtt->vm.insert_entries = gen8_ppgtt_insert;
924-
ppgtt->vm.insert_page = gen8_ppgtt_insert_entry;
967+
if (HAS_64K_PAGES(gt->i915))
968+
ppgtt->vm.insert_page = xehpsdv_ppgtt_insert_entry;
969+
else
970+
ppgtt->vm.insert_page = gen8_ppgtt_insert_entry;
925971
ppgtt->vm.allocate_va_range = gen8_ppgtt_alloc;
926972
ppgtt->vm.clear_range = gen8_ppgtt_clear;
927973
ppgtt->vm.foreach = gen8_ppgtt_foreach;

0 commit comments

Comments
 (0)