@@ -945,6 +945,30 @@ void intel_device_info_init_mmio(struct drm_i915_private *dev_priv)
vebox_mask = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >>
GEN11_GT_VEBOX_DISABLE_SHIFT;
+ if (USES_GUC_SUBMISSION(dev_priv)) {
+ struct intel_guc *guc = &dev_priv->guc;
+ struct intel_uc_fw *guc_fw = &guc->fw;
+ u32 guc_ver, guc_req;
+
+ /* GuC < 32.0.3 barfs on too many media engines */
+ /* NB: *_ver_found is not available yet so need to use _ver_wanted. */
+
+ if (!guc_fw->major_ver_wanted && !guc_fw->minor_ver_wanted) {
+ DRM_INFO("GuC FW version unknown (overridden by module param?).\n");
+ DRM_INFO("NB: FW earlier than 32.0.3 may break VCS4-7 and VECS2-3!\n");
+ } else {
+ guc_ver = (guc_fw->major_ver_wanted << 16) |
+ (guc_fw->minor_ver_wanted << 8) |
+ guc_fw->patch_ver_wanted;
+
+ guc_req = (32 << 16) | (0 << 8) | 3;
+ if (guc_ver < guc_req) {
+ vdbox_mask &= 0xF;
+ vebox_mask &= 0x3;
+ }
+ }
+ }
+
for (i = 0; i < I915_MAX_VCS; i++) {
if (!HAS_ENGINE(dev_priv, _VCS(i)))
continue;
@@ -98,6 +98,7 @@ static void guc_fw_select(struct intel_uc_fw *guc_fw)
guc_fw->path = ATS_GUC_FIRMWARE_PATH;
guc_fw->major_ver_wanted = ATS_GUC_FW_MAJOR;
guc_fw->minor_ver_wanted = ATS_GUC_FW_MINOR;
+ guc_fw->patch_ver_wanted = ATS_GUC_FW_PATCH;
} else if (IS_TIGERLAKE(i915)) {
guc_fw->path = TGL_GUC_FIRMWARE_PATH;
guc_fw->major_ver_wanted = TGL_GUC_FW_MAJOR;
@@ -62,6 +62,7 @@ struct intel_uc_fw {
*/
u16 major_ver_wanted;
u16 minor_ver_wanted;
+ u16 patch_ver_wanted;
u16 major_ver_found;
u16 minor_ver_found;