@@ -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+
725768static 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