diff options
Diffstat (limited to 'drivers/gpu/drm/i915/gt/gen8_ppgtt.c')
| -rw-r--r-- | drivers/gpu/drm/i915/gt/gen8_ppgtt.c | 34 | 
1 files changed, 26 insertions, 8 deletions
| diff --git a/drivers/gpu/drm/i915/gt/gen8_ppgtt.c b/drivers/gpu/drm/i915/gt/gen8_ppgtt.c index 037a9a6e4889..b012c50f7ce7 100644 --- a/drivers/gpu/drm/i915/gt/gen8_ppgtt.c +++ b/drivers/gpu/drm/i915/gt/gen8_ppgtt.c @@ -18,7 +18,7 @@  static u64 gen8_pde_encode(const dma_addr_t addr,  			   const enum i915_cache_level level)  { -	u64 pde = addr | _PAGE_PRESENT | _PAGE_RW; +	u64 pde = addr | GEN8_PAGE_PRESENT | GEN8_PAGE_RW;  	if (level != I915_CACHE_NONE)  		pde |= PPAT_CACHED_PDE; @@ -32,10 +32,10 @@ static u64 gen8_pte_encode(dma_addr_t addr,  			   enum i915_cache_level level,  			   u32 flags)  { -	gen8_pte_t pte = addr | _PAGE_PRESENT | _PAGE_RW; +	gen8_pte_t pte = addr | GEN8_PAGE_PRESENT | GEN8_PAGE_RW;  	if (unlikely(flags & PTE_READ_ONLY)) -		pte &= ~_PAGE_RW; +		pte &= ~GEN8_PAGE_RW;  	if (flags & PTE_LM)  		pte |= GEN12_PPGTT_PTE_LM; @@ -301,7 +301,6 @@ static void __gen8_ppgtt_alloc(struct i915_address_space * const vm,  			pt = stash->pt[!!lvl];  			__i915_gem_object_pin_pages(pt->base); -			i915_gem_object_make_unshrinkable(pt->base);  			fill_px(pt, vm->scratch[lvl]->encode); @@ -652,7 +651,7 @@ static int gen8_init_scratch(struct i915_address_space *vm)  	vm->scratch[0]->encode =  		gen8_pte_encode(px_dma(vm->scratch[0]), -				I915_CACHE_LLC, pte_flags); +				I915_CACHE_NONE, pte_flags);  	for (i = 1; i <= vm->top; i++) {  		struct drm_i915_gem_object *obj; @@ -668,7 +667,7 @@ static int gen8_init_scratch(struct i915_address_space *vm)  		}  		fill_px(obj, vm->scratch[i - 1]->encode); -		obj->encode = gen8_pde_encode(px_dma(obj), I915_CACHE_LLC); +		obj->encode = gen8_pde_encode(px_dma(obj), I915_CACHE_NONE);  		vm->scratch[i] = obj;  	} @@ -777,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) |