[Intel-xe] [PATCH 1/3] drm/xe/huc: Macro support for loading unversiond HuC

Lucas De Marchi lucas.demarchi at intel.com
Thu Mar 23 04:34:35 UTC 2023


On Wed, Mar 22, 2023 at 04:28:10PM -0700, Anusha Srivatsa wrote:
>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.
>
>Cc: Matt Roper <matthew.d.roper at intel.com>
>Cc: Lucas De Marchi <lucas.demarchi at intel.com>
>Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
>Signed-off-by: Anusha Srivatsa <anusha.srivatsa at intel.com>
>---
> drivers/gpu/drm/xe/xe_uc_fw.c | 43 +++++++++++++++++++++++------------
> 1 file changed, 28 insertions(+), 15 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_uc_fw.c b/drivers/gpu/drm/xe/xe_uc_fw.c
>index 00408f1b73e1..4ade5b1b6d31 100644
>--- a/drivers/gpu/drm/xe/xe_uc_fw.c
>+++ b/drivers/gpu/drm/xe/xe_uc_fw.c
>@@ -50,15 +50,19 @@ 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_UC_FW_PATH_MAJOR(prefix_, name_, major_) \
> 	"i915/" \
> 	__stringify(prefix_) "_" name_ "_" \
> 	__stringify(major_) ".bin"
>
>+#define __MAKE_HUC_FW_PATH(prefix_, name_) \

this name

>+        "i915/" \
>+        __stringify(prefix_) "_" name_ ".bin"
>+
> #define __MAKE_UC_FW_PATH(prefix_, name_, major_, minor_, patch_) \

clashes with this name. I suppose you mentioned to have

__MAKE_UC_FW_PATH_VERSIONED() vs __MAKE_UC_FW_PATH()

>         "i915/" \
>        __stringify(prefix_) name_ \
>@@ -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_VERSION_PATH(prefix_, major_, minor_, patch_) \
>+	__MAKE_UC_FW_PATH(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_VERSION_PATH)
>
> /* 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_VERSION_PATH(prefix_, major_, minor_, bld_num_))

I think this is getting super complex and hard to follow and it still
doesn't fix the guc situation :(

>
> 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 (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;
>+			}

missing indentation in the whole block.

I think this may work for HuC, but I think we will need to rewrite parts
of what this is doing here as it's getting very complex.

Lucas De Marchi

> 		}
> 	}
>
>-- 
>2.25.1
>


More information about the Intel-xe mailing list