[Intel-gfx] [PATCH v2] drm/i915/uc: Don't fail on HuC firmware failure

Michal Wajdeczko michal.wajdeczko at intel.com
Mon Jul 29 11:26:12 UTC 2019


HuC is usually not a critical component, so we can safely ignore
firmware load or authentication failures unless HuC was explicitly
requested by the user.

v2: add convenient way to disable loading (Chris)

Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk> #v1
---
 drivers/gpu/drm/i915/gt/uc/intel_uc.c    | 8 ++++----
 drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c | 5 +++--
 drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h | 6 ++++++
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/uc/intel_uc.c b/drivers/gpu/drm/i915/gt/uc/intel_uc.c
index fafa9be1e12a..6eb8bb3fa252 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_uc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_uc.c
@@ -422,7 +422,7 @@ int intel_uc_init_hw(struct intel_uc *uc)
 
 		if (intel_uc_is_using_huc(uc)) {
 			ret = intel_huc_fw_upload(huc);
-			if (ret)
+			if (ret && intel_uc_fw_is_overridden(&huc->fw))
 				goto err_out;
 		}
 
@@ -444,9 +444,9 @@ int intel_uc_init_hw(struct intel_uc *uc)
 	if (ret)
 		goto err_log_capture;
 
-	if (intel_uc_is_using_huc(uc)) {
+	if (intel_uc_fw_is_loaded(&huc->fw)) {
 		ret = intel_huc_auth(huc);
-		if (ret)
+		if (ret && intel_uc_fw_is_overridden(&huc->fw))
 			goto err_communication;
 	}
 
@@ -465,7 +465,7 @@ int intel_uc_init_hw(struct intel_uc *uc)
 	dev_info(i915->drm.dev, "GuC submission %s\n",
 		 enableddisabled(intel_uc_is_using_guc_submission(uc)));
 	dev_info(i915->drm.dev, "HuC %s\n",
-		 enableddisabled(intel_uc_is_using_huc(uc)));
+		 enableddisabled(intel_huc_is_authenticated(huc)));
 
 	return 0;
 
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 0f9badf44837..ac91e3efd02b 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
@@ -146,7 +146,8 @@ __uc_fw_override(struct intel_uc_fw *uc_fw)
 		break;
 	}
 
-	return uc_fw->path;
+	uc_fw->user_overridden = uc_fw->path;
+	return uc_fw->user_overridden;
 }
 
 /**
@@ -176,7 +177,7 @@ void intel_uc_fw_init_early(struct intel_uc_fw *uc_fw,
 		__uc_fw_auto_select(uc_fw, INTEL_INFO(i915)->platform,
 				    INTEL_REVID(i915));
 
-	if (uc_fw->path)
+	if (uc_fw->path && *uc_fw->path)
 		uc_fw->status = INTEL_UC_FIRMWARE_SELECTED;
 	else
 		uc_fw->status = INTEL_UC_FIRMWARE_NOT_SUPPORTED;
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 c2ab2803715d..6b64b8073703 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h
+++ b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h
@@ -61,6 +61,7 @@ struct intel_uc_fw {
 	enum intel_uc_fw_type type;
 	enum intel_uc_fw_status status;
 	const char *path;
+	bool user_overridden;
 	size_t size;
 	struct drm_i915_gem_object *obj;
 
@@ -141,6 +142,11 @@ static inline bool intel_uc_fw_supported(struct intel_uc_fw *uc_fw)
 	return __intel_uc_fw_status(uc_fw) != INTEL_UC_FIRMWARE_NOT_SUPPORTED;
 }
 
+static inline bool intel_uc_fw_is_overridden(const struct intel_uc_fw *uc_fw)
+{
+	return uc_fw->user_overridden;
+}
+
 static inline void intel_uc_fw_sanitize(struct intel_uc_fw *uc_fw)
 {
 	if (intel_uc_fw_is_loaded(uc_fw))
-- 
2.19.2



More information about the Intel-gfx mailing list