On Wed, Oct 12, 2016 at 06:47:38PM +0200, Michał Winiarski wrote:
> +static bool gen8_ppgtt_clear_pd(struct i915_address_space *vm,
>                               struct i915_page_directory *pd,
>                               uint64_t start,
>                               uint64_t length)
>  {
> +     struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
>       struct i915_page_table *pt;
>       uint64_t pde;
> +     gen8_pde_t *pde_vaddr;
> +     gen8_pde_t scratch_pde = gen8_pde_encode(px_dma(vm->scratch_pt),
> +                                              I915_CACHE_LLC);
> +     bool reduce;
>  
>       gen8_for_each_pde(pt, pd, start, length, pde) {
>               if (WARN_ON(!pd->page_table[pde]))
>                       break;
>  
> -             gen8_ppgtt_clear_pt(vm, pt, start, length);
> +             reduce = gen8_ppgtt_clear_pt(vm, pt, start, length);
> +
> +             if (reduce) {
> +                     __clear_bit(pde, pd->used_pdes);
> +                     pde_vaddr = kmap_px(pd);
> +                     pde_vaddr[pde] = scratch_pde;
> +                     kunmap_px(ppgtt, pde_vaddr);

On !48b (bsw), the pd is only partially set up, it is not backed by a
page, but i915_page_dir_dma_addr() converts the empty bit into the
scratch address instead.
Obnoxiously this requires another if (USES_FULL_48BIT_PPGTT(0)) {}
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to