[Intel-xe] [PATCH v3 14/20] drm/xe/uc: Split xe_uc_fw_init

Matt Roper matthew.d.roper at intel.com
Wed Nov 15 22:28:51 UTC 2023


On Tue, Nov 14, 2023 at 02:02:25PM +0100, Michał Winiarski wrote:
> The function does a driver specific "request firmware" step that
> includes validating the input, followed by wrapping the firmware binary
> into a buffer object. Split it into smaller parts.
> 
> Signed-off-by: Michał Winiarski <michal.winiarski at intel.com>

Reviewed-by: Matt Roper <matthew.d.roper at intel.com>

> ---
>  drivers/gpu/drm/xe/xe_uc_fw.c | 82 +++++++++++++++++++++++++++--------
>  1 file changed, 63 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_uc_fw.c b/drivers/gpu/drm/xe/xe_uc_fw.c
> index 3032c4f148d48..df46751fb5959 100644
> --- a/drivers/gpu/drm/xe/xe_uc_fw.c
> +++ b/drivers/gpu/drm/xe/xe_uc_fw.c
> @@ -524,14 +524,11 @@ static int parse_headers(struct xe_uc_fw *uc_fw, const struct firmware *fw)
>  	return 0;
>  }
>  
> -int xe_uc_fw_init(struct xe_uc_fw *uc_fw)
> +static int uc_fw_request(struct xe_uc_fw *uc_fw, const struct firmware **firmware_p)
>  {
>  	struct xe_device *xe = uc_fw_to_xe(uc_fw);
> -	struct xe_gt *gt = uc_fw_to_gt(uc_fw);
> -	struct xe_tile *tile = gt_to_tile(gt);
>  	struct device *dev = xe->drm.dev;
>  	const struct firmware *fw = NULL;
> -	struct xe_bo *obj;
>  	int err;
>  
>  	/*
> @@ -575,10 +572,41 @@ int xe_uc_fw_init(struct xe_uc_fw *uc_fw)
>  	if (err)
>  		goto fail;
>  
> -	obj = xe_bo_create_from_data(xe, tile, fw->data, fw->size,
> +	*firmware_p = fw;
> +
> +	return 0;
> +
> +fail:
> +	xe_uc_fw_change_status(uc_fw, err == -ENOENT ?
> +			       XE_UC_FIRMWARE_MISSING :
> +			       XE_UC_FIRMWARE_ERROR);
> +
> +	drm_notice(&xe->drm, "%s firmware %s: fetch failed with error %d\n",
> +		   xe_uc_fw_type_repr(uc_fw->type), uc_fw->path, err);
> +	drm_info(&xe->drm, "%s firmware(s) can be downloaded from %s\n",
> +		 xe_uc_fw_type_repr(uc_fw->type), XE_UC_FIRMWARE_URL);
> +
> +	release_firmware(fw);		/* OK even if fw is NULL */
> +
> +	return err;
> +}
> +
> +static void uc_fw_release(const struct firmware *fw)
> +{
> +	release_firmware(fw);
> +}
> +
> +static int uc_fw_copy(struct xe_uc_fw *uc_fw, const void *data, size_t size, u32 flags)
> +{
> +	struct xe_device *xe = uc_fw_to_xe(uc_fw);
> +	struct xe_gt *gt = uc_fw_to_gt(uc_fw);
> +	struct xe_tile *tile = gt_to_tile(gt);
> +	struct xe_bo *obj;
> +	int err;
> +
> +	obj = xe_bo_create_from_data(xe, tile, data, size,
>  				     ttm_bo_type_kernel,
> -				     XE_BO_CREATE_VRAM_IF_DGFX(tile) |
> -				     XE_BO_CREATE_GGTT_BIT);
> +				     flags);
>  	if (IS_ERR(obj)) {
>  		drm_notice(&xe->drm, "%s firmware %s: failed to create / populate bo",
>  			   xe_uc_fw_type_repr(uc_fw->type), uc_fw->path);
> @@ -587,28 +615,44 @@ int xe_uc_fw_init(struct xe_uc_fw *uc_fw)
>  	}
>  
>  	uc_fw->bo = obj;
> -	uc_fw->size = fw->size;
> -	xe_uc_fw_change_status(uc_fw, XE_UC_FIRMWARE_AVAILABLE);
> +	uc_fw->size = size;
>  
> -	release_firmware(fw);
> +	xe_uc_fw_change_status(uc_fw, XE_UC_FIRMWARE_AVAILABLE);
>  
>  	err = drmm_add_action_or_reset(&xe->drm, uc_fw_fini, uc_fw);
>  	if (err)
> -		return err;
> +		goto fail;
>  
>  	return 0;
>  
>  fail:
> -	xe_uc_fw_change_status(uc_fw, err == -ENOENT ?
> -			       XE_UC_FIRMWARE_MISSING :
> -			       XE_UC_FIRMWARE_ERROR);
> -
> -	drm_notice(&xe->drm, "%s firmware %s: fetch failed with error %d\n",
> +	xe_uc_fw_change_status(uc_fw, XE_UC_FIRMWARE_ERROR);
> +	drm_notice(&xe->drm, "%s firmware %s: copy failed with error %d\n",
>  		   xe_uc_fw_type_repr(uc_fw->type), uc_fw->path, err);
> -	drm_info(&xe->drm, "%s firmware(s) can be downloaded from %s\n",
> -		 xe_uc_fw_type_repr(uc_fw->type), XE_UC_FIRMWARE_URL);
>  
> -	release_firmware(fw);		/* OK even if fw is NULL */
> +	return err;
> +}
> +
> +int xe_uc_fw_init(struct xe_uc_fw *uc_fw)
> +{
> +	const struct firmware *fw = NULL;
> +	struct xe_gt *gt = uc_fw_to_gt(uc_fw);
> +	struct xe_tile *tile = gt_to_tile(gt);
> +	int err;
> +
> +	err = uc_fw_request(uc_fw, &fw);
> +	if (err)
> +		return err;
> +
> +	/* no error and no firmware means nothing to copy */
> +	if (!fw)
> +		return 0;
> +
> +	err = uc_fw_copy(uc_fw, fw->data, fw->size,
> +			 XE_BO_CREATE_VRAM_IF_DGFX(tile) | XE_BO_CREATE_GGTT_BIT);
> +
> +	uc_fw_release(fw);
> +
>  	return err;
>  }
>  
> -- 
> 2.42.1
> 

-- 
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation


More information about the Intel-xe mailing list