drm/i915/uc: Fail early if there is no GuC fw available
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Sun, 11 Aug 2019 19:51:29 +0000 (19:51 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 12 Aug 2019 08:47:42 +0000 (09:47 +0100)
We don't want to rely on misleading WOPCM partitioning error.

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

index 32aa450..aa9701c 100644 (file)
@@ -436,6 +436,11 @@ int intel_uc_init_hw(struct intel_uc *uc)
        if (!intel_uc_supports_guc(uc))
                return 0;
 
+       if (!intel_uc_fw_is_available(&guc->fw)) {
+               ret = intel_uc_fw_status_to_error(guc->fw.status);
+               goto err_out;
+       }
+
        ret = uc_init_wopcm(uc);
        if (ret)
                goto err_out;
index 0d22e73..ad7e723 100644 (file)
@@ -107,6 +107,27 @@ const char *intel_uc_fw_status_repr(enum intel_uc_fw_status status)
        return "<invalid>";
 }
 
+static inline int intel_uc_fw_status_to_error(enum intel_uc_fw_status status)
+{
+       switch (status) {
+       case INTEL_UC_FIRMWARE_NOT_SUPPORTED:
+       case INTEL_UC_FIRMWARE_UNINITIALIZED:
+               return -EPERM;
+       case INTEL_UC_FIRMWARE_MISSING:
+               return -ENOENT;
+       case INTEL_UC_FIRMWARE_ERROR:
+               return -ENOEXEC;
+       case INTEL_UC_FIRMWARE_FAIL:
+               return -EIO;
+       case INTEL_UC_FIRMWARE_SELECTED:
+       case INTEL_UC_FIRMWARE_AVAILABLE:
+       case INTEL_UC_FIRMWARE_TRANSFERRED:
+       case INTEL_UC_FIRMWARE_RUNNING:
+               return 0;
+       }
+       return -EINVAL;
+}
+
 static inline const char *intel_uc_fw_type_repr(enum intel_uc_fw_type type)
 {
        switch (type) {