From: Michal Wajdeczko Date: Sun, 18 Aug 2019 09:52:03 +0000 (+0000) Subject: drm/i915/uc: Don't always fail on unavailable GuC firmware X-Git-Tag: v5.4-rc1~32^2~13^2~49 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ee402140274e87030bbdcf92b145974f69ae01d3;p=platform%2Fkernel%2Flinux-rpi.git 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: Michal Wajdeczko Cc: Daniele Ceraolo Spurio Cc: Chris Wilson Reviewed-by: Chris Wilson Signed-off-by: Chris Wilson Link: https://patchwork.freedesktop.org/patch/msgid/20190818095204.31568-3-michal.wajdeczko@intel.com --- diff --git a/drivers/gpu/drm/i915/gt/uc/intel_uc.c b/drivers/gpu/drm/i915/gt/uc/intel_uc.c index 6f0b9e0..10978e7 100644 --- a/drivers/gpu/drm/i915/gt/uc/intel_uc.c +++ b/drivers/gpu/drm/i915/gt/uc/intel_uc.c @@ -400,6 +400,15 @@ err_out: 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) { struct drm_i915_private *i915 = uc_to_gt(uc)->i915; @@ -410,11 +419,19 @@ int intel_uc_init_hw(struct intel_uc *uc) if (!intel_uc_supports_guc(uc)) 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; 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; } @@ -507,6 +524,12 @@ err_log_capture: err_out: __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); /* We want to keep KMS alive */