Commit ee402140 authored by Michal Wajdeczko's avatar Michal Wajdeczko Committed by Chris Wilson

drm/i915/uc: Don't always fail on unavailable GuC firmware

If we failed to fetch default GuC firmware and we didn't plan
to use it for the submission and we never have used GuC before
then we may continue normal driver load, no need to declare
GPU wedged (we can use execlist for submission) and it is safe
to run without the HuC (users will check HuC status anyway).
Signed-off-by: default avatarMichal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190818095204.31568-3-michal.wajdeczko@intel.com
parent 1ce5ba97
...@@ -400,6 +400,15 @@ static int uc_init_wopcm(struct intel_uc *uc) ...@@ -400,6 +400,15 @@ static int uc_init_wopcm(struct intel_uc *uc)
return err; return err;
} }
static bool uc_is_wopcm_locked(struct intel_uc *uc)
{
struct intel_gt *gt = uc_to_gt(uc);
struct intel_uncore *uncore = gt->uncore;
return (intel_uncore_read(uncore, GUC_WOPCM_SIZE) & GUC_WOPCM_SIZE_LOCKED) ||
(intel_uncore_read(uncore, DMA_GUC_WOPCM_OFFSET) & GUC_WOPCM_OFFSET_VALID);
}
int intel_uc_init_hw(struct intel_uc *uc) int intel_uc_init_hw(struct intel_uc *uc)
{ {
struct drm_i915_private *i915 = uc_to_gt(uc)->i915; struct drm_i915_private *i915 = uc_to_gt(uc)->i915;
...@@ -410,11 +419,19 @@ int intel_uc_init_hw(struct intel_uc *uc) ...@@ -410,11 +419,19 @@ int intel_uc_init_hw(struct intel_uc *uc)
if (!intel_uc_supports_guc(uc)) if (!intel_uc_supports_guc(uc))
return 0; return 0;
if (!intel_uc_uses_guc(uc)) /*
* We can silently continue without GuC only if it was never enabled
* before on this system after reboot, otherwise we risk GPU hangs.
* To check if GuC was loaded before we look at WOPCM registers.
*/
if (!intel_uc_uses_guc(uc) && !uc_is_wopcm_locked(uc))
return 0; return 0;
if (!intel_uc_fw_is_available(&guc->fw)) { if (!intel_uc_fw_is_available(&guc->fw)) {
ret = intel_uc_fw_status_to_error(guc->fw.status); ret = uc_is_wopcm_locked(uc) ||
intel_uc_fw_is_overridden(&guc->fw) ||
intel_uc_supports_guc_submission(uc) ?
intel_uc_fw_status_to_error(guc->fw.status) : 0;
goto err_out; goto err_out;
} }
...@@ -507,6 +524,12 @@ int intel_uc_init_hw(struct intel_uc *uc) ...@@ -507,6 +524,12 @@ int intel_uc_init_hw(struct intel_uc *uc)
err_out: err_out:
__uc_sanitize(uc); __uc_sanitize(uc);
if (!ret) {
dev_notice(i915->drm.dev, "GuC is uninitialized\n");
/* We want to run without GuC submission */
return 0;
}
i915_probe_error(i915, "GuC initialization failed %d\n", ret); i915_probe_error(i915, "GuC initialization failed %d\n", ret);
/* We want to keep KMS alive */ /* We want to keep KMS alive */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment