[PATCH] drm/i915/guc: enable GuC GGTT invalidation from the start

John Harrison john.c.harrison at intel.com
Fri Dec 2 18:47:28 UTC 2022


On 11/10/2022 09:58, Daniele Ceraolo Spurio wrote:
> Invalidating the GuC TLBs while GuC is not loaded does not have negative
> consequences, so if we're starting the driver with GuC enabled we can
> use the GGTT invalidation function from the get-go, iinstead of switching
> to it when we initialize the GuC objects.
>
> In MTL, this fixes and issue where we try to overwrite the invalidation
> function twice (once for each GuC), due to the GGTT being shared between
> the primary and media GTs
>
> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Cc: Matt Roper <matthew.d.roper at intel.com>
> Cc: Radhakrishna Sripada <radhakrishna.sripada at intel.com>
> Cc: John Harrison <John.C.Harrison at Intel.com>
> Cc: Aravind Iddamsetty <aravind.iddamsetty at intel.com>
Reviewed-by: John Harrison <John.C.Harrison at Intel.com>

> ---
>   drivers/gpu/drm/i915/gt/intel_ggtt.c   | 28 ++++----------------------
>   drivers/gpu/drm/i915/gt/intel_gtt.h    |  2 --
>   drivers/gpu/drm/i915/gt/uc/intel_guc.c |  7 -------
>   3 files changed, 4 insertions(+), 33 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_ggtt.c b/drivers/gpu/drm/i915/gt/intel_ggtt.c
> index 2518cebbf931..2dbe6ad5c900 100644
> --- a/drivers/gpu/drm/i915/gt/intel_ggtt.c
> +++ b/drivers/gpu/drm/i915/gt/intel_ggtt.c
> @@ -979,7 +979,10 @@ static int gen8_gmch_probe(struct i915_ggtt *ggtt)
>   			I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND;
>   	}
>   
> -	ggtt->invalidate = gen8_ggtt_invalidate;
> +	if (intel_uc_wants_guc(&ggtt->vm.gt->uc))
> +		ggtt->invalidate = guc_ggtt_invalidate;
> +	else
> +		ggtt->invalidate = gen8_ggtt_invalidate;
>   
>   	ggtt->vm.vma_ops.bind_vma    = intel_ggtt_bind_vma;
>   	ggtt->vm.vma_ops.unbind_vma  = intel_ggtt_unbind_vma;
> @@ -1216,29 +1219,6 @@ int i915_ggtt_enable_hw(struct drm_i915_private *i915)
>   	return 0;
>   }
>   
> -void i915_ggtt_enable_guc(struct i915_ggtt *ggtt)
> -{
> -	GEM_BUG_ON(ggtt->invalidate != gen8_ggtt_invalidate);
> -
> -	ggtt->invalidate = guc_ggtt_invalidate;
> -
> -	ggtt->invalidate(ggtt);
> -}
> -
> -void i915_ggtt_disable_guc(struct i915_ggtt *ggtt)
> -{
> -	/* XXX Temporary pardon for error unload */
> -	if (ggtt->invalidate == gen8_ggtt_invalidate)
> -		return;
> -
> -	/* We should only be called after i915_ggtt_enable_guc() */
> -	GEM_BUG_ON(ggtt->invalidate != guc_ggtt_invalidate);
> -
> -	ggtt->invalidate = gen8_ggtt_invalidate;
> -
> -	ggtt->invalidate(ggtt);
> -}
> -
>   /**
>    * i915_ggtt_resume_vm - Restore the memory mappings for a GGTT or DPT VM
>    * @vm: The VM to restore the mappings for
> diff --git a/drivers/gpu/drm/i915/gt/intel_gtt.h b/drivers/gpu/drm/i915/gt/intel_gtt.h
> index 4d75ba4bb41d..fcbbfed79f15 100644
> --- a/drivers/gpu/drm/i915/gt/intel_gtt.h
> +++ b/drivers/gpu/drm/i915/gt/intel_gtt.h
> @@ -579,8 +579,6 @@ void intel_ggtt_unbind_vma(struct i915_address_space *vm,
>   int i915_ggtt_probe_hw(struct drm_i915_private *i915);
>   int i915_ggtt_init_hw(struct drm_i915_private *i915);
>   int i915_ggtt_enable_hw(struct drm_i915_private *i915);
> -void i915_ggtt_enable_guc(struct i915_ggtt *ggtt);
> -void i915_ggtt_disable_guc(struct i915_ggtt *ggtt);
>   int i915_init_ggtt(struct drm_i915_private *i915);
>   void i915_ggtt_driver_release(struct drm_i915_private *i915);
>   void i915_ggtt_driver_late_release(struct drm_i915_private *i915);
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc.c b/drivers/gpu/drm/i915/gt/uc/intel_guc.c
> index 1bcd61bb50f8..4ec954b6b4e8 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_guc.c
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc.c
> @@ -421,9 +421,6 @@ int intel_guc_init(struct intel_guc *guc)
>   	/* now that everything is perma-pinned, initialize the parameters */
>   	guc_init_params(guc);
>   
> -	/* We need to notify the guc whenever we change the GGTT */
> -	i915_ggtt_enable_guc(gt->ggtt);
> -
>   	intel_uc_fw_change_status(&guc->fw, INTEL_UC_FIRMWARE_LOADABLE);
>   
>   	return 0;
> @@ -448,13 +445,9 @@ int intel_guc_init(struct intel_guc *guc)
>   
>   void intel_guc_fini(struct intel_guc *guc)
>   {
> -	struct intel_gt *gt = guc_to_gt(guc);
> -
>   	if (!intel_uc_fw_is_loadable(&guc->fw))
>   		return;
>   
> -	i915_ggtt_disable_guc(gt->ggtt);
> -
>   	if (intel_guc_slpc_is_used(guc))
>   		intel_guc_slpc_fini(&guc->slpc);
>   



More information about the dri-devel mailing list