Commit 80ab3179 authored by John Harrison's avatar John Harrison

drm/i915/guc: Actually return an error if GuC version range check fails

Dan Carpenter pointed out that 'err' was not being set in the case
where the GuC firmware version range check fails. Fix that.

Note that while this is a bug fix for a previous patch (see Fixes tag
below). It is an exceedingly low risk bug. The range check is
asserting that the GuC firmware version is within spec. So it should
not be possible to ever have a firmware file that fails this check. If
larger version numbers are required in the future, that would be a
backwards breaking spec change and thus require a major version bump,
in which case an old i915 driver would not load that new version anyway.

Fixes: 9bbba066 ("drm/i915/guc: Use GuC submission API version number")
Reported-by: default avatarDan Carpenter <error27@gmail.com>
Signed-off-by: default avatarJohn Harrison <John.C.Harrison@Intel.com>
Cc: John Harrison <John.C.Harrison@Intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Alan Previn <alan.previn.teres.alexis@intel.com>
Cc: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Andi Shyti <andi.shyti@linux.intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: default avatarAndi Shyti <andi.shyti@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230421224742.2357198-1-John.C.Harrison@Intel.com
parent 47d8b302
...@@ -635,9 +635,10 @@ static bool is_ver_8bit(struct intel_uc_fw_ver *ver) ...@@ -635,9 +635,10 @@ static bool is_ver_8bit(struct intel_uc_fw_ver *ver)
return ver->major < 0xFF && ver->minor < 0xFF && ver->patch < 0xFF; return ver->major < 0xFF && ver->minor < 0xFF && ver->patch < 0xFF;
} }
static bool guc_check_version_range(struct intel_uc_fw *uc_fw) static int guc_check_version_range(struct intel_uc_fw *uc_fw)
{ {
struct intel_guc *guc = container_of(uc_fw, struct intel_guc, fw); struct intel_guc *guc = container_of(uc_fw, struct intel_guc, fw);
struct intel_gt *gt = __uc_fw_to_gt(uc_fw);
/* /*
* GuC version number components are defined as being 8-bits. * GuC version number components are defined as being 8-bits.
...@@ -646,24 +647,24 @@ static bool guc_check_version_range(struct intel_uc_fw *uc_fw) ...@@ -646,24 +647,24 @@ static bool guc_check_version_range(struct intel_uc_fw *uc_fw)
*/ */
if (!is_ver_8bit(&uc_fw->file_selected.ver)) { if (!is_ver_8bit(&uc_fw->file_selected.ver)) {
gt_warn(__uc_fw_to_gt(uc_fw), "%s firmware: invalid file version: 0x%02X:%02X:%02X\n", gt_warn(gt, "%s firmware: invalid file version: 0x%02X:%02X:%02X\n",
intel_uc_fw_type_repr(uc_fw->type), intel_uc_fw_type_repr(uc_fw->type),
uc_fw->file_selected.ver.major, uc_fw->file_selected.ver.major,
uc_fw->file_selected.ver.minor, uc_fw->file_selected.ver.minor,
uc_fw->file_selected.ver.patch); uc_fw->file_selected.ver.patch);
return false; return -EINVAL;
} }
if (!is_ver_8bit(&guc->submission_version)) { if (!is_ver_8bit(&guc->submission_version)) {
gt_warn(__uc_fw_to_gt(uc_fw), "%s firmware: invalid submit version: 0x%02X:%02X:%02X\n", gt_warn(gt, "%s firmware: invalid submit version: 0x%02X:%02X:%02X\n",
intel_uc_fw_type_repr(uc_fw->type), intel_uc_fw_type_repr(uc_fw->type),
guc->submission_version.major, guc->submission_version.major,
guc->submission_version.minor, guc->submission_version.minor,
guc->submission_version.patch); guc->submission_version.patch);
return false; return -EINVAL;
} }
return true; return i915_inject_probe_error(gt->i915, -EINVAL);
} }
static int check_fw_header(struct intel_gt *gt, static int check_fw_header(struct intel_gt *gt,
...@@ -772,8 +773,11 @@ int intel_uc_fw_fetch(struct intel_uc_fw *uc_fw) ...@@ -772,8 +773,11 @@ int intel_uc_fw_fetch(struct intel_uc_fw *uc_fw)
if (err) if (err)
goto fail; goto fail;
if (uc_fw->type == INTEL_UC_FW_TYPE_GUC && !guc_check_version_range(uc_fw)) if (uc_fw->type == INTEL_UC_FW_TYPE_GUC) {
err = guc_check_version_range(uc_fw);
if (err)
goto fail; goto fail;
}
if (uc_fw->file_wanted.ver.major && uc_fw->file_selected.ver.major) { if (uc_fw->file_wanted.ver.major && uc_fw->file_selected.ver.major) {
/* Check the file's major version was as it claimed */ /* Check the file's major version was as it claimed */
......
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