All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Harrison <john.c.harrison@intel.com>
To: Lucas De Marchi <lucas.demarchi@intel.com>,
	intel-xe <intel-xe@lists.freedesktop.org>
Cc: Matt Roper <matthew.d.roper@intel.com>
Subject: Re: [PATCH 2/2] drm/xe/uc: Add support for different firmware files on each GT
Date: Thu, 20 Mar 2025 13:09:19 -0700	[thread overview]
Message-ID: <b61776ff-e409-4e2f-868d-ae564362a13a@intel.com> (raw)
In-Reply-To: <20250307-xe-per-gt-fw-v1-2-459574d76400@intel.com>

On 3/7/2025 10:13 AM, Lucas De Marchi wrote:
> The different GTs on a device can be very different. Right now for all
> platforms the same firmware is loaded in each GT, however future
> platforms may benefit from loading a different file depending on the GT
> type.
>
> Based on previous patch by John Harrison <John.C.Harrison@Intel.com>.
>
> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: John Harrison <John.C.Harrison@Intel.com>

> ---
>   drivers/gpu/drm/xe/xe_uc_fw.c | 100 ++++++++++++++++++++++++------------------
>   1 file changed, 58 insertions(+), 42 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_uc_fw.c b/drivers/gpu/drm/xe/xe_uc_fw.c
> index c22da0ce9fb0d..a230d0501f804 100644
> --- a/drivers/gpu/drm/xe/xe_uc_fw.c
> +++ b/drivers/gpu/drm/xe/xe_uc_fw.c
> @@ -92,6 +92,8 @@
>   
>   struct uc_fw_entry {
>   	enum xe_platform platform;
> +	enum xe_gt_type gt_type;
> +
>   	struct {
>   		const char *path;
>   		u16 major;
> @@ -106,35 +108,40 @@ struct fw_blobs_by_type {
>   	u32 count;
>   };
>   
> -#define XE_GUC_FIRMWARE_DEFS(fw_def, mmp_ver, major_ver)			\
> -	fw_def(PANTHERLAKE,	mmp_ver(xe,	guc,	ptl,	70, 38, 1))	\
> -	fw_def(BATTLEMAGE,	major_ver(xe,	guc,	bmg,	70, 29, 2))	\
> -	fw_def(LUNARLAKE,	major_ver(xe,	guc,	lnl,	70, 29, 2))	\
> -	fw_def(METEORLAKE,	major_ver(i915,	guc,	mtl,	70, 29, 2))	\
> -	fw_def(PVC,		mmp_ver(xe,	guc,	pvc,	70, 29, 2))	\
> -	fw_def(DG2,		major_ver(i915,	guc,	dg2,	70, 29, 2))	\
> -	fw_def(DG1,		major_ver(i915,	guc,	dg1,	70, 29, 2))	\
> -	fw_def(ALDERLAKE_N,	major_ver(i915,	guc,	tgl,	70, 29, 2))	\
> -	fw_def(ALDERLAKE_P,	major_ver(i915,	guc,	adlp,	70, 29, 2))	\
> -	fw_def(ALDERLAKE_S,	major_ver(i915,	guc,	tgl,	70, 29, 2))	\
> -	fw_def(ROCKETLAKE,	major_ver(i915,	guc,	tgl,	70, 29, 2))	\
> -	fw_def(TIGERLAKE,	major_ver(i915,	guc,	tgl,	70, 29, 2))
> +/*
> + * Add an "ANY" define just to convey the meaning it's given here.
> + */
> +#define XE_GT_TYPE_ANY XE_GT_TYPE_UNINITIALIZED
> +
> +#define XE_GUC_FIRMWARE_DEFS(fw_def, mmp_ver, major_ver)					\
> +	fw_def(PANTHERLAKE,	GT_TYPE_ANY,	mmp_ver(xe,	guc,	ptl,	70, 38, 1))	\
> +	fw_def(BATTLEMAGE,	GT_TYPE_ANY,	major_ver(xe,	guc,	bmg,	70, 29, 2))	\
> +	fw_def(LUNARLAKE,	GT_TYPE_ANY,	major_ver(xe,	guc,	lnl,	70, 29, 2))	\
> +	fw_def(METEORLAKE,	GT_TYPE_ANY,	major_ver(i915,	guc,	mtl,	70, 29, 2))	\
> +	fw_def(PVC,		GT_TYPE_ANY,	mmp_ver(xe,	guc,	pvc,	70, 29, 2))	\
> +	fw_def(DG2,		GT_TYPE_ANY,	major_ver(i915,	guc,	dg2,	70, 29, 2))	\
> +	fw_def(DG1,		GT_TYPE_ANY,	major_ver(i915,	guc,	dg1,	70, 29, 2))	\
> +	fw_def(ALDERLAKE_N,	GT_TYPE_ANY,	major_ver(i915,	guc,	tgl,	70, 29, 2))	\
> +	fw_def(ALDERLAKE_P,	GT_TYPE_ANY,	major_ver(i915,	guc,	adlp,	70, 29, 2))	\
> +	fw_def(ALDERLAKE_S,	GT_TYPE_ANY,	major_ver(i915,	guc,	tgl,	70, 29, 2))	\
> +	fw_def(ROCKETLAKE,	GT_TYPE_ANY,	major_ver(i915,	guc,	tgl,	70, 29, 2))	\
> +	fw_def(TIGERLAKE,	GT_TYPE_ANY,	major_ver(i915,	guc,	tgl,	70, 29, 2))
>   
>   #define XE_HUC_FIRMWARE_DEFS(fw_def, mmp_ver, no_ver)		\
> -	fw_def(PANTHERLAKE,	mmp_ver(xe,	huc,		ptl, 10, 2, 1))	\
> -	fw_def(BATTLEMAGE,	no_ver(xe,	huc,		bmg))		\
> -	fw_def(LUNARLAKE,	no_ver(xe,	huc,		lnl))		\
> -	fw_def(METEORLAKE,	no_ver(i915,	huc_gsc,	mtl))		\
> -	fw_def(DG1,		no_ver(i915,	huc,		dg1))		\
> -	fw_def(ALDERLAKE_P,	no_ver(i915,	huc,		tgl))		\
> -	fw_def(ALDERLAKE_S,	no_ver(i915,	huc,		tgl))		\
> -	fw_def(ROCKETLAKE,	no_ver(i915,	huc,		tgl))		\
> -	fw_def(TIGERLAKE,	no_ver(i915,	huc,		tgl))
> +	fw_def(PANTHERLAKE,	GT_TYPE_ANY,	mmp_ver(xe,	huc,		ptl, 10, 2, 1))	\
> +	fw_def(BATTLEMAGE,	GT_TYPE_ANY,	no_ver(xe,	huc,		bmg))		\
> +	fw_def(LUNARLAKE,	GT_TYPE_ANY,	no_ver(xe,	huc,		lnl))		\
> +	fw_def(METEORLAKE,	GT_TYPE_ANY,	no_ver(i915,	huc_gsc,	mtl))		\
> +	fw_def(DG1,		GT_TYPE_ANY,	no_ver(i915,	huc,		dg1))		\
> +	fw_def(ALDERLAKE_P,	GT_TYPE_ANY,	no_ver(i915,	huc,		tgl))		\
> +	fw_def(ALDERLAKE_S,	GT_TYPE_ANY,	no_ver(i915,	huc,		tgl))		\
> +	fw_def(ROCKETLAKE,	GT_TYPE_ANY,	no_ver(i915,	huc,		tgl))		\
> +	fw_def(TIGERLAKE,	GT_TYPE_ANY,	no_ver(i915,	huc,		tgl))
>   
>   /* for the GSC FW we match the compatibility version and not the release one */
> -#define XE_GSC_FIRMWARE_DEFS(fw_def, major_ver)		\
> -	fw_def(LUNARLAKE,	major_ver(xe,	gsc,	lnl,	104, 1, 0)) \
> -	fw_def(METEORLAKE,	major_ver(i915,	gsc,	mtl,	102, 1, 0))
> +#define XE_GSC_FIRMWARE_DEFS(fw_def, major_ver)							\
> +	fw_def(LUNARLAKE,	GT_TYPE_ANY, major_ver(xe,	gsc,	lnl,	104, 1, 0))	\
> +	fw_def(METEORLAKE,	GT_TYPE_ANY, major_ver(i915,	gsc,	mtl,	102, 1, 0))
>   
>   #define MAKE_FW_PATH(dir__, uc__, shortname__, version__)			\
>   	__stringify(dir__) "/" __stringify(shortname__) "_" __stringify(uc__) version__ ".bin"
> @@ -162,12 +169,13 @@ struct fw_blobs_by_type {
>   	  a, b, c }
>   
>   /* All blobs need to be declared via MODULE_FIRMWARE() */
> -#define XE_UC_MODULE_FIRMWARE(platform__, fw_filename)				\
> +#define XE_UC_MODULE_FIRMWARE(platform__, gt_type__, fw_filename)		\
>   	MODULE_FIRMWARE(fw_filename);
>   
> -#define XE_UC_FW_ENTRY(platform__, entry__)					\
> +#define XE_UC_FW_ENTRY(platform__, gt_type__, entry__)				\
>   	{									\
>   		.platform = XE_ ## platform__,					\
> +		.gt_type = XE_ ## gt_type__,					\
>   		entry__,							\
>   	},
>   
> @@ -225,30 +233,38 @@ uc_fw_auto_select(struct xe_device *xe, struct xe_uc_fw *uc_fw)
>   		[XE_UC_FW_TYPE_HUC] = { entries_huc, ARRAY_SIZE(entries_huc) },
>   		[XE_UC_FW_TYPE_GSC] = { entries_gsc, ARRAY_SIZE(entries_gsc) },
>   	};
> +	struct xe_gt *gt = uc_fw_to_gt(uc_fw);
>   	enum xe_platform p = xe->info.platform;
>   	const struct uc_fw_entry *entries;
>   	u32 count;
>   	int i;
>   
> -	xe_assert(xe, uc_fw->type < ARRAY_SIZE(blobs_all));
> +	xe_gt_assert(gt, uc_fw->type < ARRAY_SIZE(blobs_all));
> +	xe_gt_assert(gt, gt->info.type != XE_GT_TYPE_UNINITIALIZED);
> +
>   	entries = blobs_all[uc_fw->type].entries;
>   	count = blobs_all[uc_fw->type].count;
>   
>   	for (i = 0; i < count && p <= entries[i].platform; i++) {
> -		if (p == entries[i].platform) {
> -			uc_fw->path = entries[i].path;
> -			uc_fw->versions.wanted.major = entries[i].major;
> -			uc_fw->versions.wanted.minor = entries[i].minor;
> -			uc_fw->versions.wanted.patch = entries[i].patch;
> -			uc_fw->full_ver_required = entries[i].full_ver_required;
> -
> -			if (uc_fw->type == XE_UC_FW_TYPE_GSC)
> -				uc_fw->versions.wanted_type = XE_UC_FW_VER_COMPATIBILITY;
> -			else
> -				uc_fw->versions.wanted_type = XE_UC_FW_VER_RELEASE;
> -
> -			break;
> -		}
> +		if (p != entries[i].platform)
> +			continue;
> +
> +		if (entries[i].gt_type != XE_GT_TYPE_ANY &&
> +		    entries[i].gt_type != gt->info.type)
> +			continue;
> +
> +		uc_fw->path = entries[i].path;
> +		uc_fw->versions.wanted.major = entries[i].major;
> +		uc_fw->versions.wanted.minor = entries[i].minor;
> +		uc_fw->versions.wanted.patch = entries[i].patch;
> +		uc_fw->full_ver_required = entries[i].full_ver_required;
> +
> +		if (uc_fw->type == XE_UC_FW_TYPE_GSC)
> +			uc_fw->versions.wanted_type = XE_UC_FW_VER_COMPATIBILITY;
> +		else
> +			uc_fw->versions.wanted_type = XE_UC_FW_VER_RELEASE;
> +
> +		break;
>   	}
>   }
>   
>


  reply	other threads:[~2025-03-20 20:09 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-07 18:13 [PATCH 0/2] drm/xe: Support different GuCs per GT Lucas De Marchi
2025-03-07 18:13 ` [PATCH 1/2] drm/xe/uc: Remove static from loop variable Lucas De Marchi
2025-03-20 20:08   ` John Harrison
2025-03-07 18:13 ` [PATCH 2/2] drm/xe/uc: Add support for different firmware files on each GT Lucas De Marchi
2025-03-20 20:09   ` John Harrison [this message]
2025-03-07 20:01 ` ✓ CI.Patch_applied: success for drm/xe: Support different GuCs per GT Patchwork
2025-03-07 20:01 ` ✗ CI.checkpatch: warning " Patchwork
2025-03-07 20:02 ` ✓ CI.KUnit: success " Patchwork
2025-03-07 20:19 ` ✓ CI.Build: " Patchwork
2025-03-07 20:21 ` ✓ CI.Hooks: " Patchwork
2025-03-07 20:23 ` ✓ CI.checksparse: " Patchwork
2025-03-07 20:45 ` ✓ Xe.CI.BAT: " Patchwork
2025-03-09  0:37 ` ✗ Xe.CI.Full: failure " Patchwork
2025-03-20 20:09 ` [PATCH 0/2] " John Harrison
2025-03-21 18:42   ` Lucas De Marchi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b61776ff-e409-4e2f-868d-ae564362a13a@intel.com \
    --to=john.c.harrison@intel.com \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=lucas.demarchi@intel.com \
    --cc=matthew.d.roper@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.