Skip to content

Commit d445635

Browse files
Lucas De Marchibardliao
authored andcommitted
drm/xe/uc: Add support for different firmware files on each GT
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>. Reviewed-by: John Harrison <John.C.Harrison@Intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250307-xe-per-gt-fw-v1-2-459574d76400@intel.com Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
1 parent 49d0bcb commit d445635

1 file changed

Lines changed: 54 additions & 38 deletions

File tree

drivers/gpu/drm/xe/xe_uc_fw.c

Lines changed: 54 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@
9292

9393
struct uc_fw_entry {
9494
enum xe_platform platform;
95+
enum xe_gt_type gt_type;
96+
9597
struct {
9698
const char *path;
9799
u16 major;
@@ -106,32 +108,37 @@ struct fw_blobs_by_type {
106108
u32 count;
107109
};
108110

109-
#define XE_GUC_FIRMWARE_DEFS(fw_def, mmp_ver, major_ver) \
110-
fw_def(BATTLEMAGE, major_ver(xe, guc, bmg, 70, 29, 2)) \
111-
fw_def(LUNARLAKE, major_ver(xe, guc, lnl, 70, 29, 2)) \
112-
fw_def(METEORLAKE, major_ver(i915, guc, mtl, 70, 29, 2)) \
113-
fw_def(DG2, major_ver(i915, guc, dg2, 70, 29, 2)) \
114-
fw_def(DG1, major_ver(i915, guc, dg1, 70, 29, 2)) \
115-
fw_def(ALDERLAKE_N, major_ver(i915, guc, tgl, 70, 29, 2)) \
116-
fw_def(ALDERLAKE_P, major_ver(i915, guc, adlp, 70, 29, 2)) \
117-
fw_def(ALDERLAKE_S, major_ver(i915, guc, tgl, 70, 29, 2)) \
118-
fw_def(ROCKETLAKE, major_ver(i915, guc, tgl, 70, 29, 2)) \
119-
fw_def(TIGERLAKE, major_ver(i915, guc, tgl, 70, 29, 2))
111+
/*
112+
* Add an "ANY" define just to convey the meaning it's given here.
113+
*/
114+
#define XE_GT_TYPE_ANY XE_GT_TYPE_UNINITIALIZED
115+
116+
#define XE_GUC_FIRMWARE_DEFS(fw_def, mmp_ver, major_ver) \
117+
fw_def(BATTLEMAGE, GT_TYPE_ANY, major_ver(xe, guc, bmg, 70, 29, 2)) \
118+
fw_def(LUNARLAKE, GT_TYPE_ANY, major_ver(xe, guc, lnl, 70, 29, 2)) \
119+
fw_def(METEORLAKE, GT_TYPE_ANY, major_ver(i915, guc, mtl, 70, 29, 2)) \
120+
fw_def(DG2, GT_TYPE_ANY, major_ver(i915, guc, dg2, 70, 29, 2)) \
121+
fw_def(DG1, GT_TYPE_ANY, major_ver(i915, guc, dg1, 70, 29, 2)) \
122+
fw_def(ALDERLAKE_N, GT_TYPE_ANY, major_ver(i915, guc, tgl, 70, 29, 2)) \
123+
fw_def(ALDERLAKE_P, GT_TYPE_ANY, major_ver(i915, guc, adlp, 70, 29, 2)) \
124+
fw_def(ALDERLAKE_S, GT_TYPE_ANY, major_ver(i915, guc, tgl, 70, 29, 2)) \
125+
fw_def(ROCKETLAKE, GT_TYPE_ANY, major_ver(i915, guc, tgl, 70, 29, 2)) \
126+
fw_def(TIGERLAKE, GT_TYPE_ANY, major_ver(i915, guc, tgl, 70, 29, 2))
120127

121128
#define XE_HUC_FIRMWARE_DEFS(fw_def, mmp_ver, no_ver) \
122-
fw_def(BATTLEMAGE, no_ver(xe, huc, bmg)) \
123-
fw_def(LUNARLAKE, no_ver(xe, huc, lnl)) \
124-
fw_def(METEORLAKE, no_ver(i915, huc_gsc, mtl)) \
125-
fw_def(DG1, no_ver(i915, huc, dg1)) \
126-
fw_def(ALDERLAKE_P, no_ver(i915, huc, tgl)) \
127-
fw_def(ALDERLAKE_S, no_ver(i915, huc, tgl)) \
128-
fw_def(ROCKETLAKE, no_ver(i915, huc, tgl)) \
129-
fw_def(TIGERLAKE, no_ver(i915, huc, tgl))
129+
fw_def(BATTLEMAGE, GT_TYPE_ANY, no_ver(xe, huc, bmg)) \
130+
fw_def(LUNARLAKE, GT_TYPE_ANY, no_ver(xe, huc, lnl)) \
131+
fw_def(METEORLAKE, GT_TYPE_ANY, no_ver(i915, huc_gsc, mtl)) \
132+
fw_def(DG1, GT_TYPE_ANY, no_ver(i915, huc, dg1)) \
133+
fw_def(ALDERLAKE_P, GT_TYPE_ANY, no_ver(i915, huc, tgl)) \
134+
fw_def(ALDERLAKE_S, GT_TYPE_ANY, no_ver(i915, huc, tgl)) \
135+
fw_def(ROCKETLAKE, GT_TYPE_ANY, no_ver(i915, huc, tgl)) \
136+
fw_def(TIGERLAKE, GT_TYPE_ANY, no_ver(i915, huc, tgl))
130137

131138
/* for the GSC FW we match the compatibility version and not the release one */
132139
#define XE_GSC_FIRMWARE_DEFS(fw_def, major_ver) \
133-
fw_def(LUNARLAKE, major_ver(xe, gsc, lnl, 104, 1, 0)) \
134-
fw_def(METEORLAKE, major_ver(i915, gsc, mtl, 102, 1, 0))
140+
fw_def(LUNARLAKE, GT_TYPE_ANY, major_ver(xe, gsc, lnl, 104, 1, 0)) \
141+
fw_def(METEORLAKE, GT_TYPE_ANY, major_ver(i915, gsc, mtl, 102, 1, 0))
135142

136143
#define MAKE_FW_PATH(dir__, uc__, shortname__, version__) \
137144
__stringify(dir__) "/" __stringify(shortname__) "_" __stringify(uc__) version__ ".bin"
@@ -159,12 +166,13 @@ struct fw_blobs_by_type {
159166
a, b, c }
160167

161168
/* All blobs need to be declared via MODULE_FIRMWARE() */
162-
#define XE_UC_MODULE_FIRMWARE(platform__, fw_filename) \
169+
#define XE_UC_MODULE_FIRMWARE(platform__, gt_type__, fw_filename) \
163170
MODULE_FIRMWARE(fw_filename);
164171

165-
#define XE_UC_FW_ENTRY(platform__, entry__) \
172+
#define XE_UC_FW_ENTRY(platform__, gt_type__, entry__) \
166173
{ \
167174
.platform = XE_ ## platform__, \
175+
.gt_type = XE_ ## gt_type__, \
168176
entry__, \
169177
},
170178

@@ -222,30 +230,38 @@ uc_fw_auto_select(struct xe_device *xe, struct xe_uc_fw *uc_fw)
222230
[XE_UC_FW_TYPE_HUC] = { entries_huc, ARRAY_SIZE(entries_huc) },
223231
[XE_UC_FW_TYPE_GSC] = { entries_gsc, ARRAY_SIZE(entries_gsc) },
224232
};
233+
struct xe_gt *gt = uc_fw_to_gt(uc_fw);
225234
enum xe_platform p = xe->info.platform;
226235
const struct uc_fw_entry *entries;
227236
u32 count;
228237
int i;
229238

230-
xe_assert(xe, uc_fw->type < ARRAY_SIZE(blobs_all));
239+
xe_gt_assert(gt, uc_fw->type < ARRAY_SIZE(blobs_all));
240+
xe_gt_assert(gt, gt->info.type != XE_GT_TYPE_UNINITIALIZED);
241+
231242
entries = blobs_all[uc_fw->type].entries;
232243
count = blobs_all[uc_fw->type].count;
233244

234245
for (i = 0; i < count && p <= entries[i].platform; i++) {
235-
if (p == entries[i].platform) {
236-
uc_fw->path = entries[i].path;
237-
uc_fw->versions.wanted.major = entries[i].major;
238-
uc_fw->versions.wanted.minor = entries[i].minor;
239-
uc_fw->versions.wanted.patch = entries[i].patch;
240-
uc_fw->full_ver_required = entries[i].full_ver_required;
241-
242-
if (uc_fw->type == XE_UC_FW_TYPE_GSC)
243-
uc_fw->versions.wanted_type = XE_UC_FW_VER_COMPATIBILITY;
244-
else
245-
uc_fw->versions.wanted_type = XE_UC_FW_VER_RELEASE;
246-
247-
break;
248-
}
246+
if (p != entries[i].platform)
247+
continue;
248+
249+
if (entries[i].gt_type != XE_GT_TYPE_ANY &&
250+
entries[i].gt_type != gt->info.type)
251+
continue;
252+
253+
uc_fw->path = entries[i].path;
254+
uc_fw->versions.wanted.major = entries[i].major;
255+
uc_fw->versions.wanted.minor = entries[i].minor;
256+
uc_fw->versions.wanted.patch = entries[i].patch;
257+
uc_fw->full_ver_required = entries[i].full_ver_required;
258+
259+
if (uc_fw->type == XE_UC_FW_TYPE_GSC)
260+
uc_fw->versions.wanted_type = XE_UC_FW_VER_COMPATIBILITY;
261+
else
262+
uc_fw->versions.wanted_type = XE_UC_FW_VER_RELEASE;
263+
264+
break;
249265
}
250266
}
251267

0 commit comments

Comments
 (0)