drm/i915/gtt: Mark tlbs dirty on clear
Now when clearing ptes can modify upper level pdp's, we need to mark them dirty so that they will be flushed correctly. Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1478006856-8313-1-git-send-email-mika.kuoppala@intel.com
This commit is contained in:
parent
37c6393431
commit
fce937559e
@ -707,6 +707,16 @@ static int gen8_48b_mm_switch(struct i915_hw_ppgtt *ppgtt,
|
|||||||
return gen8_write_pdp(req, 0, px_dma(&ppgtt->pml4));
|
return gen8_write_pdp(req, 0, px_dma(&ppgtt->pml4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* PDE TLBs are a pain to invalidate on GEN8+. When we modify
|
||||||
|
* the page table structures, we mark them dirty so that
|
||||||
|
* context switching/execlist queuing code takes extra steps
|
||||||
|
* to ensure that tlbs are flushed.
|
||||||
|
*/
|
||||||
|
static void mark_tlbs_dirty(struct i915_hw_ppgtt *ppgtt)
|
||||||
|
{
|
||||||
|
ppgtt->pd_dirty_rings = INTEL_INFO(ppgtt->base.dev)->ring_mask;
|
||||||
|
}
|
||||||
|
|
||||||
/* Removes entries from a single page table, releasing it if it's empty.
|
/* Removes entries from a single page table, releasing it if it's empty.
|
||||||
* Caller can use the return value to update higher-level entries.
|
* Caller can use the return value to update higher-level entries.
|
||||||
*/
|
*/
|
||||||
@ -809,6 +819,8 @@ static bool gen8_ppgtt_clear_pdp(struct i915_address_space *vm,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mark_tlbs_dirty(ppgtt);
|
||||||
|
|
||||||
if (USES_FULL_48BIT_PPGTT(vm->dev) &&
|
if (USES_FULL_48BIT_PPGTT(vm->dev) &&
|
||||||
bitmap_empty(pdp->used_pdpes, I915_PDPES_PER_PDP(vm->dev))) {
|
bitmap_empty(pdp->used_pdpes, I915_PDPES_PER_PDP(vm->dev))) {
|
||||||
free_pdp(vm->dev, pdp);
|
free_pdp(vm->dev, pdp);
|
||||||
@ -1283,16 +1295,6 @@ err_out:
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PDE TLBs are a pain to invalidate on GEN8+. When we modify
|
|
||||||
* the page table structures, we mark them dirty so that
|
|
||||||
* context switching/execlist queuing code takes extra steps
|
|
||||||
* to ensure that tlbs are flushed.
|
|
||||||
*/
|
|
||||||
static void mark_tlbs_dirty(struct i915_hw_ppgtt *ppgtt)
|
|
||||||
{
|
|
||||||
ppgtt->pd_dirty_rings = INTEL_INFO(ppgtt->base.dev)->ring_mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int gen8_alloc_va_range_3lvl(struct i915_address_space *vm,
|
static int gen8_alloc_va_range_3lvl(struct i915_address_space *vm,
|
||||||
struct i915_page_directory_pointer *pdp,
|
struct i915_page_directory_pointer *pdp,
|
||||||
uint64_t start,
|
uint64_t start,
|
||||||
|
Loading…
Reference in New Issue
Block a user