drm/i915/uc: correctly track uc_fw init failure
authorDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Sat, 11 Dec 2021 00:07:54 +0000 (16:07 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 21 Jul 2022 19:24:25 +0000 (21:24 +0200)
[ Upstream commit 35d4efec103e1afde968cfc9305f00f9aceb19cc ]

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@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211211000756.1698923-2-daniele.ceraolospurio@intel.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/i915/gt/uc/intel_guc_fw.c
drivers/gpu/drm/i915/gt/uc/intel_huc.c
drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h

index 76fe766ad1bc61a49de1ab5bca6aa555e6c95f1a..bb951b8d5203358e5a65fee842600973f7861e3a 100644 (file)
@@ -159,6 +159,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;
 }
index fc5387b410a2bb9be16966ebd43b55f7ed3eb798..9ee22ac9254095a925a8fb9a90642d614bd53246 100644 (file)
@@ -191,7 +191,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;
 }
 
index 3a16d08608a544c55ba56714fe01d24cbb52b124..6be7fbf9d18a8f86763a0f883294a4160f2e8292 100644 (file)
@@ -526,7 +526,7 @@ fail:
        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;
 }
 
@@ -544,7 +544,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;
index 99bb1fe1af6686d01386e0c96f5aaa74416f7c85..c1a7246fb7d6e1abca326d75eaf29ab44a8636cd 100644 (file)
@@ -31,11 +31,12 @@ struct intel_gt;
  * |            |    MISSING <--/    |    \--> ERROR                |
  * |   fetch    |                    V                              |
  * |            |                 AVAILABLE                         |
- * +------------+-                   |                             -+
+ * +------------+-                   |   \                         -+
+ * |            |                    |    \--> INIT FAIL            |
  * |   init     |                    V                              |
  * |            |        /------> LOADABLE <----<-----------\       |
  * +------------+-       \         /    \        \           \     -+
- * |            |         FAIL <--<      \--> TRANSFERRED     \     |
+ * |            |    LOAD FAIL <--<      \--> TRANSFERRED     \     |
  * |   upload   |                  \           /   \          /     |
  * |            |                   \---------/     \--> RUNNING    |
  * +------------+---------------------------------------------------+
@@ -49,8 +50,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 */
 };
@@ -121,10 +123,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:
@@ -146,7 +150,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;