drm/i915/uc: Don't fail on HuC early init errors
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Sun, 4 Aug 2019 19:50:52 +0000 (19:50 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 5 Aug 2019 17:25:26 +0000 (18:25 +0100)
Since commit 301efe96f777 ("drm/i915/uc: Don't fail on HuC
firmware failure") we can continue driver load after error
during HuC firmware load or authentication, but we could
still fail on any error during early HuC initialization.
Change that by ignoring HuC related errors until hardware
initialization phase where we can decide about next steps.

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>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190804195052.31140-5-michal.wajdeczko@intel.com
drivers/gpu/drm/i915/gt/uc/intel_huc.c
drivers/gpu/drm/i915/gt/uc/intel_uc.c

index 66b2d5fdb31707b20620b32c0a4eed13668efff1..faaf8ad5ba89ffef339a26fdc246c7993f1ddefd 100644 (file)
@@ -52,6 +52,11 @@ static int intel_huc_rsa_data_create(struct intel_huc *huc)
        struct i915_vma *vma;
        size_t copied;
        void *vaddr;
+       int err;
+
+       err = i915_inject_load_error(gt->i915, -ENXIO);
+       if (err)
+               return err;
 
        /*
         * HuC firmware will sit above GUC_GGTT_TOP and will not map
@@ -115,8 +120,8 @@ out_fini:
 
 void intel_huc_fini(struct intel_huc *huc)
 {
-       intel_uc_fw_fini(&huc->fw);
        intel_huc_rsa_data_destroy(huc);
+       intel_uc_fw_fini(&huc->fw);
 }
 
 /**
index 1ddd252419ec439aaff3b6e8ff2ca048558579ee..e87b7904ab7ad250b38f3860dbcf3b5e937b147f 100644 (file)
@@ -316,14 +316,14 @@ int intel_uc_init(struct intel_uc *uc)
        if (intel_uc_supports_huc(uc)) {
                ret = intel_huc_init(huc);
                if (ret)
-                       goto err_guc;
+                       goto out_huc;
        }
 
        return 0;
 
-err_guc:
-       intel_guc_fini(guc);
-       return ret;
+out_huc:
+       intel_uc_fw_cleanup_fetch(&huc->fw);
+       return 0;
 }
 
 void intel_uc_fini(struct intel_uc *uc)