[Intel-gfx] [PATCH 1/3] drm/i915/uc: correctly track uc_fw init failure
Matthew Brost
matthew.brost at intel.com
Thu Dec 9 19:04:11 UTC 2021
On Wed, Dec 08, 2021 at 04:56:08PM -0800, Daniele Ceraolo Spurio wrote:
> The FAILURE state of uc_fw currently implies that the fw is loadable
> (i.e init completed), so we can't use it for init failures and instead
> need a dedicated error code.
>
> Note that this currently does not cause any issues because if we fail to
> init any of the firmwares we abort the load, but better be accurate
> anyway in case things change in the future.
>
> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
Reviewed-by: Matthew Brost <matthew.brost at intel.com>
> ---
> drivers/gpu/drm/i915/gt/uc/intel_guc_fw.c | 2 +-
> drivers/gpu/drm/i915/gt/uc/intel_huc.c | 2 +-
> drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c | 4 ++--
> drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h | 17 +++++++++++------
> 4 files changed, 15 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_fw.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_fw.c
> index 196424be0998..796483a41353 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_fw.c
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_fw.c
> @@ -164,6 +164,6 @@ int intel_guc_fw_upload(struct intel_guc *guc)
> return 0;
>
> out:
> - intel_uc_fw_change_status(&guc->fw, INTEL_UC_FIRMWARE_FAIL);
> + intel_uc_fw_change_status(&guc->fw, INTEL_UC_FIRMWARE_LOAD_FAIL);
> return ret;
> }
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_huc.c b/drivers/gpu/drm/i915/gt/uc/intel_huc.c
> index ff4b6869b80b..c10736dddfb4 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_huc.c
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_huc.c
> @@ -199,7 +199,7 @@ int intel_huc_auth(struct intel_huc *huc)
>
> fail:
> i915_probe_error(gt->i915, "HuC: Authentication failed %d\n", ret);
> - intel_uc_fw_change_status(&huc->fw, INTEL_UC_FIRMWARE_FAIL);
> + intel_uc_fw_change_status(&huc->fw, INTEL_UC_FIRMWARE_LOAD_FAIL);
> return ret;
> }
>
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
> index 3aa87be4f2e4..b7fa51aefdff 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
> @@ -540,7 +540,7 @@ int intel_uc_fw_upload(struct intel_uc_fw *uc_fw, u32 dst_offset, u32 dma_flags)
> i915_probe_error(gt->i915, "Failed to load %s firmware %s (%d)\n",
> intel_uc_fw_type_repr(uc_fw->type), uc_fw->path,
> err);
> - intel_uc_fw_change_status(uc_fw, INTEL_UC_FIRMWARE_FAIL);
> + intel_uc_fw_change_status(uc_fw, INTEL_UC_FIRMWARE_LOAD_FAIL);
> return err;
> }
>
> @@ -558,7 +558,7 @@ int intel_uc_fw_init(struct intel_uc_fw *uc_fw)
> if (err) {
> DRM_DEBUG_DRIVER("%s fw pin-pages err=%d\n",
> intel_uc_fw_type_repr(uc_fw->type), err);
> - intel_uc_fw_change_status(uc_fw, INTEL_UC_FIRMWARE_FAIL);
> + intel_uc_fw_change_status(uc_fw, INTEL_UC_FIRMWARE_INIT_FAIL);
> }
>
> return err;
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h
> index 1e00bf65639e..fd17abf2ab02 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h
> @@ -32,11 +32,12 @@ struct intel_gt;
> * | | MISSING <--/ | \--> ERROR |
> * | fetch | V |
> * | | AVAILABLE |
> - * +------------+- | -+
> + * +------------+- | \ -+
> + * | | | \--> INIT FAIL |
> * | init | V |
> * | | /------> LOADABLE <----<-----------\ |
> * +------------+- \ / \ \ \ -+
> - * | | FAIL <--< \--> TRANSFERRED \ |
> + * | | LOAD FAIL <--< \--> TRANSFERRED \ |
> * | upload | \ / \ / |
> * | | \---------/ \--> RUNNING |
> * +------------+---------------------------------------------------+
> @@ -50,8 +51,9 @@ enum intel_uc_fw_status {
> INTEL_UC_FIRMWARE_MISSING, /* blob not found on the system */
> INTEL_UC_FIRMWARE_ERROR, /* invalid format or version */
> INTEL_UC_FIRMWARE_AVAILABLE, /* blob found and copied in mem */
> + INTEL_UC_FIRMWARE_INIT_FAIL, /* failed to prepare fw objects for load */
> INTEL_UC_FIRMWARE_LOADABLE, /* all fw-required objects are ready */
> - INTEL_UC_FIRMWARE_FAIL, /* failed to xfer or init/auth the fw */
> + INTEL_UC_FIRMWARE_LOAD_FAIL, /* failed to xfer or init/auth the fw */
> INTEL_UC_FIRMWARE_TRANSFERRED, /* dma xfer done */
> INTEL_UC_FIRMWARE_RUNNING /* init/auth done */
> };
> @@ -130,10 +132,12 @@ const char *intel_uc_fw_status_repr(enum intel_uc_fw_status status)
> return "ERROR";
> case INTEL_UC_FIRMWARE_AVAILABLE:
> return "AVAILABLE";
> + case INTEL_UC_FIRMWARE_INIT_FAIL:
> + return "INIT FAIL";
> case INTEL_UC_FIRMWARE_LOADABLE:
> return "LOADABLE";
> - case INTEL_UC_FIRMWARE_FAIL:
> - return "FAIL";
> + case INTEL_UC_FIRMWARE_LOAD_FAIL:
> + return "LOAD FAIL";
> case INTEL_UC_FIRMWARE_TRANSFERRED:
> return "TRANSFERRED";
> case INTEL_UC_FIRMWARE_RUNNING:
> @@ -155,7 +159,8 @@ static inline int intel_uc_fw_status_to_error(enum intel_uc_fw_status status)
> return -ENOENT;
> case INTEL_UC_FIRMWARE_ERROR:
> return -ENOEXEC;
> - case INTEL_UC_FIRMWARE_FAIL:
> + case INTEL_UC_FIRMWARE_INIT_FAIL:
> + case INTEL_UC_FIRMWARE_LOAD_FAIL:
> return -EIO;
> case INTEL_UC_FIRMWARE_SELECTED:
> return -ESTALE;
> --
> 2.25.1
>
More information about the Intel-gfx
mailing list