[PATCH] drm/i915/huc: always init the delayed load fence

John Harrison john.c.harrison at intel.com
Mon Nov 28 18:54:56 UTC 2022


On 11/23/2022 15:54, Daniele Ceraolo Spurio wrote:
> The fence is only tracking if the HuC load is in progress or not and
> doesn't distinguish between already loaded, not supported or disabled,
> so we can always initialize it to completed, no matter the actual
> support. We already do that for most platforms, but we skip it on
> GTs that lack VCS engines (i.e. MTL root GT), so fix that. Note that the
i.e. -> e.g., there is more than just MTL root GT.

> cleanup is already unconditional.
>
> While at it, move the init/fini to helper functions.
>
> Fixes: 02224691cb0f ("drm/i915/huc: fix leak of debug object in huc load fence on driver unload")
> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Cc: John Harrison <John.C.Harrison at Intel.com>
> Cc: Alan Previn <alan.previn.teres.alexis at intel.com>
> ---
>   drivers/gpu/drm/i915/gt/uc/intel_huc.c | 47 +++++++++++++++++++-------
>   1 file changed, 34 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_huc.c b/drivers/gpu/drm/i915/gt/uc/intel_huc.c
> index 0976e9101346..5f393f8e8b2e 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_huc.c
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_huc.c
> @@ -211,6 +211,30 @@ void intel_huc_unregister_gsc_notifier(struct intel_huc *huc, struct bus_type *b
>   	huc->delayed_load.nb.notifier_call = NULL;
>   }
>   
> +static void delayed_huc_load_init(struct intel_huc *huc)
> +{
> +	/*
> +	 * Initialize fence to be complete as this is expected to be complete
> +	 * unless there is a delayed HuC reload in progress.
reload -> load?

> +	 */
> +	i915_sw_fence_init(&huc->delayed_load.fence,
> +			   sw_fence_dummy_notify);
> +	i915_sw_fence_commit(&huc->delayed_load.fence);
> +
> +	hrtimer_init(&huc->delayed_load.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
> +	huc->delayed_load.timer.function = huc_delayed_load_timer_callback;
> +}
> +
> +static void delayed_huc_load_fini(struct intel_huc *huc)
> +{
> +	/*
> +	 * the fence is initialized in init_early, so we need to clean it up
> +	 * even if HuC loading is off.
> +	 */
> +	delayed_huc_load_complete(huc);
> +	i915_sw_fence_fini(&huc->delayed_load.fence);
> +}
> +
>   static bool vcs_supported(struct intel_gt *gt)
>   {
>   	intel_engine_mask_t mask = gt->info.engine_mask;
> @@ -241,6 +265,15 @@ void intel_huc_init_early(struct intel_huc *huc)
>   
>   	intel_uc_fw_init_early(&huc->fw, INTEL_UC_FW_TYPE_HUC);
>   
> +	/*
> +	 * we always init the fence as already completed, even if HuC is not
> +	 * supported. This way we don't have to distinguish between HuC not
> +	 * supported/disabled or already loaded, band can focus on if the load
band -> and

Looks good otherwise. So with the typos fixed:
Reviewed-by: John Harrison <John.C.Harrison at Intel.com>

> +	 * is currently in progress (fence not complete) or not, which is what
> +	 * we care about for stalling userspace submissions.
> +	 */
> +	delayed_huc_load_init(huc);
> +
>   	if (!vcs_supported(gt)) {
>   		intel_uc_fw_change_status(&huc->fw, INTEL_UC_FIRMWARE_NOT_SUPPORTED);
>   		return;
> @@ -255,17 +288,6 @@ void intel_huc_init_early(struct intel_huc *huc)
>   		huc->status.mask = HUC_FW_VERIFIED;
>   		huc->status.value = HUC_FW_VERIFIED;
>   	}
> -
> -	/*
> -	 * Initialize fence to be complete as this is expected to be complete
> -	 * unless there is a delayed HuC reload in progress.
> -	 */
> -	i915_sw_fence_init(&huc->delayed_load.fence,
> -			   sw_fence_dummy_notify);
> -	i915_sw_fence_commit(&huc->delayed_load.fence);
> -
> -	hrtimer_init(&huc->delayed_load.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
> -	huc->delayed_load.timer.function = huc_delayed_load_timer_callback;
>   }
>   
>   #define HUC_LOAD_MODE_STRING(x) (x ? "GSC" : "legacy")
> @@ -333,8 +355,7 @@ void intel_huc_fini(struct intel_huc *huc)
>   	 * the fence is initialized in init_early, so we need to clean it up
>   	 * even if HuC loading is off.
>   	 */
> -	delayed_huc_load_complete(huc);
> -	i915_sw_fence_fini(&huc->delayed_load.fence);
> +	delayed_huc_load_fini(huc);
>   
>   	if (intel_uc_fw_is_loadable(&huc->fw))
>   		intel_uc_fw_fini(&huc->fw);



More information about the dri-devel mailing list