[Intel-gfx] [PATCH 01/21] drm/i915/gtt: Mark TLBS dirty for gen8+
Joonas Lahtinen
joonas.lahtinen at linux.intel.com
Tue Jun 23 04:10:01 PDT 2015
On to, 2015-06-11 at 20:37 +0300, Mika Kuoppala wrote:
> When we touch gen8+ page maps, mark them dirty like we
> do with previous gens.
>
> v2: Update comment (Joonas)
>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Signed-off-by: Mika Kuoppala <mika.kuoppala at intel.com>
> ---
> drivers/gpu/drm/i915/i915_gem_gtt.c | 22 ++++++++++++----------
> 1 file changed, 12 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index 619dad1..0a906e4 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -830,6 +830,16 @@ err_out:
> 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,
> uint64_t start,
> uint64_t length)
> @@ -915,6 +925,7 @@ static int gen8_alloc_va_range(struct i915_address_space *vm,
> }
>
> free_gen8_temp_bitmaps(new_page_dirs, new_page_tables);
> + mark_tlbs_dirty(ppgtt);
> return 0;
>
> err_out:
> @@ -927,6 +938,7 @@ err_out:
> unmap_and_free_pd(ppgtt->pdp.page_directory[pdpe], vm->dev);
>
> free_gen8_temp_bitmaps(new_page_dirs, new_page_tables);
> + mark_tlbs_dirty(ppgtt);
> return ret;
> }
>
> @@ -1267,16 +1279,6 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
> 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,
> struct i915_page_table *pt)
> {
More information about the Intel-gfx
mailing list