diff options
| author | Anusha Srivatsa <[email protected]> | 2023-03-23 15:46:50 -0700 |
|---|---|---|
| committer | Rodrigo Vivi <[email protected]> | 2023-12-19 18:30:21 -0500 |
| commit | 85ea2bd2fd18ec43e2569da3e21c91fc6832b464 (patch) | |
| tree | be74b6ff2c6f9c14c9b9d6aefd380a450cf7e340 /drivers/gpu | |
| parent | b4eecedc75c1b75eee359c806fc964f70e0fc983 (diff) | |
drm/xe/huc: Support for loading unversiond HuC
Follow the new direction of firmware and add macro
support for loading unversioned HuC. Keep HuC
versioned loading support as well for platforms
that fall under force_probe support
Add check to ensure driver does not do any version check
for HuC if going through unversioned load.
v2: unversioned firmware to be the default for platforms
not under force_probe. Maintain versioned firmware macro support
for platforms under force-probe protection.
v3: Minor style and naming adjustments (Lucas)
Cc: Matt Roper <[email protected]>
Cc: Daniele Ceraolo Spurio <[email protected]>
Signed-off-by: Anusha Srivatsa <[email protected]>
Reviewed-by: Lucas De Marchi <[email protected]>
Signed-off-by: Lucas De Marchi <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Rodrigo Vivi <[email protected]>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/xe/xe_uc_fw.c | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/drivers/gpu/drm/xe/xe_uc_fw.c b/drivers/gpu/drm/xe/xe_uc_fw.c index 47b51ad5b015..f3e4e3774d68 100644 --- a/drivers/gpu/drm/xe/xe_uc_fw.c +++ b/drivers/gpu/drm/xe/xe_uc_fw.c @@ -50,18 +50,22 @@ static struct xe_device *uc_fw_to_xe(struct xe_uc_fw *uc_fw) fw_def(DG1, 0, guc_def(dg1, 70, 5, 2)) \ fw_def(TIGERLAKE, 0, guc_def(tgl, 70, 5, 2)) -#define XE_HUC_FIRMWARE_DEFS(fw_def, huc_def) \ - fw_def(DG1, 0, huc_def(dg1, 7, 9, 3)) \ - fw_def(TIGERLAKE, 0, huc_def(tgl, 7, 9, 3)) +#define XE_HUC_FIRMWARE_DEFS(fw_def, huc_def, huc_ver) \ + fw_def(DG1, 0, huc_def(dg1)) \ + fw_def(TIGERLAKE, 0, huc_def(tgl)) + +#define __MAKE_HUC_FW_PATH(prefix_, name_) \ + "i915/" \ + __stringify(prefix_) "_" name_ ".bin" #define __MAKE_UC_FW_PATH_MAJOR(prefix_, name_, major_) \ "i915/" \ __stringify(prefix_) "_" name_ "_" \ __stringify(major_) ".bin" -#define __MAKE_UC_FW_PATH(prefix_, name_, major_, minor_, patch_) \ +#define __MAKE_UC_FW_PATH_FULL_VER(prefix_, name_, major_, minor_, patch_) \ "i915/" \ - __stringify(prefix_) name_ \ + __stringify(prefix_) "_" name_ "_" \ __stringify(major_) "." \ __stringify(minor_) "." \ __stringify(patch_) ".bin" @@ -69,15 +73,19 @@ static struct xe_device *uc_fw_to_xe(struct xe_uc_fw *uc_fw) #define MAKE_GUC_FW_PATH(prefix_, major_, minor_, patch_) \ __MAKE_UC_FW_PATH_MAJOR(prefix_, "guc", major_) -#define MAKE_HUC_FW_PATH(prefix_, major_, minor_, bld_num_) \ - __MAKE_UC_FW_PATH(prefix_, "_huc_", major_, minor_, bld_num_) +#define MAKE_HUC_FW_PATH(prefix_) \ + __MAKE_HUC_FW_PATH(prefix_, "huc") + +#define MAKE_HUC_FW_PATH_FULL_VER(prefix_, major_, minor_, patch_) \ + __MAKE_UC_FW_PATH_FULL_VER(prefix_, "huc", major_, minor_, patch_) + /* All blobs need to be declared via MODULE_FIRMWARE() */ #define XE_UC_MODULE_FW(platform_, revid_, uc_) \ MODULE_FIRMWARE(uc_); XE_GUC_FIRMWARE_DEFS(XE_UC_MODULE_FW, MAKE_GUC_FW_PATH) -XE_HUC_FIRMWARE_DEFS(XE_UC_MODULE_FW, MAKE_HUC_FW_PATH) +XE_HUC_FIRMWARE_DEFS(XE_UC_MODULE_FW, MAKE_HUC_FW_PATH, MAKE_HUC_FW_PATH_FULL_VER) /* The below structs and macros are used to iterate across the list of blobs */ struct __packed uc_fw_blob { @@ -93,9 +101,12 @@ struct __packed uc_fw_blob { UC_FW_BLOB(major_, minor_, \ MAKE_GUC_FW_PATH(prefix_, major_, minor_, patch_)) -#define HUC_FW_BLOB(prefix_, major_, minor_, bld_num_) \ +#define HUC_FW_BLOB(prefix_) \ + UC_FW_BLOB(0, 0, MAKE_HUC_FW_PATH(prefix_)) + +#define HUC_FW_VERSION_BLOB(prefix_, major_, minor_, bld_num_) \ UC_FW_BLOB(major_, minor_, \ - MAKE_HUC_FW_PATH(prefix_, major_, minor_, bld_num_)) + MAKE_HUC_FW_PATH_FULL_VER(prefix_, major_, minor_, bld_num_)) struct __packed uc_fw_platform_requirement { enum xe_platform p; @@ -122,7 +133,7 @@ uc_fw_auto_select(struct xe_device *xe, struct xe_uc_fw *uc_fw) XE_GUC_FIRMWARE_DEFS(MAKE_FW_LIST, GUC_FW_BLOB) }; static const struct uc_fw_platform_requirement blobs_huc[] = { - XE_HUC_FIRMWARE_DEFS(MAKE_FW_LIST, HUC_FW_BLOB) + XE_HUC_FIRMWARE_DEFS(MAKE_FW_LIST, HUC_FW_BLOB, HUC_FW_VERSION_BLOB) }; static const struct fw_blobs_by_type blobs_all[XE_UC_FW_NUM_TYPES] = { [XE_UC_FW_TYPE_GUC] = { blobs_guc, ARRAY_SIZE(blobs_guc) }, @@ -299,15 +310,17 @@ int xe_uc_fw_init(struct xe_uc_fw *uc_fw) uc_fw->minor_ver_found = FIELD_GET(CSS_SW_VERSION_UC_MINOR, css->sw_version); - if (uc_fw->major_ver_found != uc_fw->major_ver_wanted || - uc_fw->minor_ver_found < uc_fw->minor_ver_wanted) { - drm_notice(&xe->drm, "%s firmware %s: unexpected version: %u.%u != %u.%u\n", - xe_uc_fw_type_repr(uc_fw->type), uc_fw->path, - uc_fw->major_ver_found, uc_fw->minor_ver_found, - uc_fw->major_ver_wanted, uc_fw->minor_ver_wanted); - if (!xe_uc_fw_is_overridden(uc_fw)) { - err = -ENOEXEC; - goto fail; + if (uc_fw->major_ver_wanted) { + if (uc_fw->major_ver_found != uc_fw->major_ver_wanted || + uc_fw->minor_ver_found < uc_fw->minor_ver_wanted) { + drm_notice(&xe->drm, "%s firmware %s: unexpected version: %u.%u != %u.%u\n", + xe_uc_fw_type_repr(uc_fw->type), uc_fw->path, + uc_fw->major_ver_found, uc_fw->minor_ver_found, + uc_fw->major_ver_wanted, uc_fw->minor_ver_wanted); + if (!xe_uc_fw_is_overridden(uc_fw)) { + err = -ENOEXEC; + goto fail; + } } } |