9292
9393struct 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