Commit 5b7e4c9c authored by Mika Kuoppala's avatar Mika Kuoppala Committed by Daniel Vetter

drm/i915/gtt: Mark TLBS dirty for gen8+

When we touch gen8+ page maps, mark them dirty like we
do with previous gens.

v2: Update comment (Joonas)
Signed-off-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 9e2ee2dd
...@@ -831,6 +831,16 @@ int __must_check alloc_gen8_temp_bitmaps(unsigned long **new_pds, ...@@ -831,6 +831,16 @@ int __must_check alloc_gen8_temp_bitmaps(unsigned long **new_pds,
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(struct i915_address_space *vm, static int gen8_alloc_va_range(struct i915_address_space *vm,
uint64_t start, uint64_t start,
uint64_t length) uint64_t length)
...@@ -916,6 +926,7 @@ static int gen8_alloc_va_range(struct i915_address_space *vm, ...@@ -916,6 +926,7 @@ static int gen8_alloc_va_range(struct i915_address_space *vm,
} }
free_gen8_temp_bitmaps(new_page_dirs, new_page_tables); free_gen8_temp_bitmaps(new_page_dirs, new_page_tables);
mark_tlbs_dirty(ppgtt);
return 0; return 0;
err_out: err_out:
...@@ -928,6 +939,7 @@ static int gen8_alloc_va_range(struct i915_address_space *vm, ...@@ -928,6 +939,7 @@ static int gen8_alloc_va_range(struct i915_address_space *vm,
unmap_and_free_pd(ppgtt->pdp.page_directory[pdpe], vm->dev); unmap_and_free_pd(ppgtt->pdp.page_directory[pdpe], vm->dev);
free_gen8_temp_bitmaps(new_page_dirs, new_page_tables); free_gen8_temp_bitmaps(new_page_dirs, new_page_tables);
mark_tlbs_dirty(ppgtt);
return ret; return ret;
} }
...@@ -1272,16 +1284,6 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm, ...@@ -1272,16 +1284,6 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
kunmap_atomic(pt_vaddr); kunmap_atomic(pt_vaddr);
} }
/* PDE TLBs are a pain invalidate pre GEN8. It requires a context reload. If we
* are switching between contexts with the same LRCA, we also must do a force
* restore.
*/
static void mark_tlbs_dirty(struct i915_hw_ppgtt *ppgtt)
{
/* If current vm != vm, */
ppgtt->pd_dirty_rings = INTEL_INFO(ppgtt->base.dev)->ring_mask;
}
static void gen6_initialize_pt(struct i915_address_space *vm, static void gen6_initialize_pt(struct i915_address_space *vm,
struct i915_page_table *pt) struct i915_page_table *pt)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment