[2/3] drm/i915/uc: Cleanup fw fetch on every GuC/HuC init failure

Submitted by Michal Wajdeczko on Aug. 17, 2019, 1:11 p.m.

Details

Message ID 20190817131144.26884-3-michal.wajdeczko@intel.com
State Accepted
Commit 4a600cb707e1249472bd9c1c7d63bb971fc6675d
Headers show
Series "Don't fail on uc init step" ( rev: 1 ) in Intel GFX

Not browsing as part of any series.

Commit Message

Michal Wajdeczko Aug. 17, 2019, 1:11 p.m.
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>
---
 drivers/gpu/drm/i915/gt/uc/intel_guc.c   | 1 +
 drivers/gpu/drm/i915/gt/uc/intel_huc.c   | 6 +++++-
 drivers/gpu/drm/i915/gt/uc/intel_uc.c    | 8 +-------
 drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c | 4 +++-
 drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h | 1 +
 5 files changed, 11 insertions(+), 9 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc.c b/drivers/gpu/drm/i915/gt/uc/intel_guc.c
index 855b4bd432bf..180973d79ef3 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc.c
@@ -302,6 +302,7 @@  int intel_guc_init(struct intel_guc *guc)
 	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;
 }
 
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_huc.c b/drivers/gpu/drm/i915/gt/uc/intel_huc.c
index 1edda1657411..6f1475ba0871 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_huc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_huc.c
@@ -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;
 }
 
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_uc.c b/drivers/gpu/drm/i915/gt/uc/intel_uc.c
index 449c432dd768..d8e9be1d7b0e 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_uc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_uc.c
@@ -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)
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 527de1fd9d78..bd22bf11adad 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
@@ -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;
 }
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 bacee0d318c0..7a0a5989afc9 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h
+++ b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h
@@ -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:

Comments

Quoting Michal Wajdeczko (2019-08-17 14:11:43)
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_uc.c b/drivers/gpu/drm/i915/gt/uc/intel_uc.c
> index 449c432dd768..d8e9be1d7b0e 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_uc.c
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_uc.c
> @@ -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);
>         }

Insert checkpatch comments about residual {}

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
-Chris