drm/i915/uc: Cleanup fw fetch on every GuC/HuC init failure
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Sat, 17 Aug 2019 13:11:43 +0000 (13:11 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Sat, 17 Aug 2019 14:04:36 +0000 (15:04 +0100)
Be consistent and always perform fw fetch cleanup in GuC/HuC specific
init functions on every failure. Also while converting firmware
status to error, stop treating SELECTED as non-error, as long term
we should not see it.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190817131144.26884-3-michal.wajdeczko@intel.com
drivers/gpu/drm/i915/gt/uc/intel_guc.c
drivers/gpu/drm/i915/gt/uc/intel_huc.c
drivers/gpu/drm/i915/gt/uc/intel_uc.c
drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h

index 855b4bd..180973d 100644 (file)
@@ -302,6 +302,7 @@ err_fw:
        intel_uc_fw_fini(&guc->fw);
 err_fetch:
        intel_uc_fw_cleanup_fetch(&guc->fw);
+       DRM_DEV_DEBUG_DRIVER(gt->i915->drm.dev, "failed with %d\n", ret);
        return ret;
 }
 
index 1edda16..6f1475b 100644 (file)
@@ -77,11 +77,12 @@ static void intel_huc_rsa_data_destroy(struct intel_huc *huc)
 
 int intel_huc_init(struct intel_huc *huc)
 {
+       struct drm_i915_private *i915 = huc_to_gt(huc)->i915;
        int err;
 
        err = intel_uc_fw_init(&huc->fw);
        if (err)
-               return err;
+               goto out;
 
        /*
         * HuC firmware image is outside GuC accessible range.
@@ -96,6 +97,9 @@ int intel_huc_init(struct intel_huc *huc)
 
 out_fini:
        intel_uc_fw_fini(&huc->fw);
+out:
+       intel_uc_fw_cleanup_fetch(&huc->fw);
+       DRM_DEV_DEBUG_DRIVER(i915->drm.dev, "failed with %d\n", err);
        return err;
 }
 
index 449c432..d8e9be1 100644 (file)
@@ -305,16 +305,10 @@ int intel_uc_init(struct intel_uc *uc)
                return ret;
 
        if (intel_uc_uses_huc(uc)) {
-               ret = intel_huc_init(huc);
-               if (ret)
-                       goto out_huc;
+               intel_huc_init(huc);
        }
 
        return 0;
-
-out_huc:
-       intel_uc_fw_cleanup_fetch(&huc->fw);
-       return 0;
 }
 
 void intel_uc_fini(struct intel_uc *uc)
index 527de1f..bd22bf1 100644 (file)
@@ -542,9 +542,11 @@ int intel_uc_fw_init(struct intel_uc_fw *uc_fw)
                return -ENOEXEC;
 
        err = i915_gem_object_pin_pages(uc_fw->obj);
-       if (err)
+       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);
+       }
 
        return err;
 }
index bacee0d..7a0a598 100644 (file)
@@ -141,6 +141,7 @@ static inline int intel_uc_fw_status_to_error(enum intel_uc_fw_status status)
        case INTEL_UC_FIRMWARE_FAIL:
                return -EIO;
        case INTEL_UC_FIRMWARE_SELECTED:
+               return -ESTALE;
        case INTEL_UC_FIRMWARE_AVAILABLE:
        case INTEL_UC_FIRMWARE_TRANSFERRED:
        case INTEL_UC_FIRMWARE_RUNNING: