drm/i915/uc: Don't fail on HuC firmware failure
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Mon, 29 Jul 2019 11:26:12 +0000 (11:26 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 29 Jul 2019 21:03:39 +0000 (22:03 +0100)
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@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> #v1
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190729112612.37476-1-michal.wajdeczko@intel.com
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 fafa9be1e12a97fc8599ee4cd164ae65d2336dc4..6eb8bb3fa2522d356a4d37f1aa7a458f030efc99 100644 (file)
@@ -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;
 
index 0f9badf4483796f9dc74b64cfaec619110117c76..ac91e3efd02bdc683175cb8ffdf0b2975de42099 100644 (file)
@@ -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;
index c2ab2803715d00e1ada67d698f3663403ce08183..6b64b8073703c65e35ae2836eb0b5f9e6bfefd5d 100644 (file)
@@ -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))