drm/xe/rtp: Also check gt type
authorLucas De Marchi <lucas.demarchi@intel.com>
Fri, 26 May 2023 16:43:57 +0000 (09:43 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 19 Dec 2023 23:34:04 +0000 (18:34 -0500)
When running rules on MTL and beyond that have media as a standalone GT,
the rule should only match if the gt passed as parameter match the
version/range/stepping that the rule is checking. This allows
workarounds affecting only the media GT to be applied only on that GT
and vice-versa.

For platforms before MTL, the GT will not be of media type, even if it
includes media engines. Make sure to cover that case by checking if the
platforma has standalone media.

Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://lore.kernel.org/r/20230526164358.86393-21-lucas.demarchi@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_rtp.c

index ebcfb04c391a00e1b8b1473d3d0d5f09e3aa3528..43a86358efb68b59f7d1216cd208f2447e8e158d 100644 (file)
  * the values to the registers that have matching rules.
  */
 
+static bool has_samedia(const struct xe_device *xe)
+{
+       return xe->info.media_verx100 >= 1300;
+}
+
 static bool rule_matches(const struct xe_device *xe,
                         struct xe_gt *gt,
                         struct xe_hw_engine *hwe,
@@ -43,26 +48,32 @@ static bool rule_matches(const struct xe_device *xe,
                                xe->info.subplatform == r->subplatform;
                        break;
                case XE_RTP_MATCH_GRAPHICS_VERSION:
-                       match = xe->info.graphics_verx100 == r->ver_start;
+                       match = xe->info.graphics_verx100 == r->ver_start &&
+                               (!has_samedia(xe) || !xe_gt_is_media_type(gt));
                        break;
                case XE_RTP_MATCH_GRAPHICS_VERSION_RANGE:
                        match = xe->info.graphics_verx100 >= r->ver_start &&
-                               xe->info.graphics_verx100 <= r->ver_end;
+                               xe->info.graphics_verx100 <= r->ver_end &&
+                               (!has_samedia(xe) || !xe_gt_is_media_type(gt));
                        break;
                case XE_RTP_MATCH_GRAPHICS_STEP:
                        match = xe->info.step.graphics >= r->step_start &&
-                               xe->info.step.graphics < r->step_end;
+                               xe->info.step.graphics < r->step_end &&
+                               (!has_samedia(xe) || !xe_gt_is_media_type(gt));
                        break;
                case XE_RTP_MATCH_MEDIA_VERSION:
-                       match = xe->info.media_verx100 == r->ver_start;
+                       match = xe->info.media_verx100 == r->ver_start &&
+                               (!has_samedia(xe) || xe_gt_is_media_type(gt));
                        break;
                case XE_RTP_MATCH_MEDIA_VERSION_RANGE:
                        match = xe->info.media_verx100 >= r->ver_start &&
-                               xe->info.media_verx100 <= r->ver_end;
+                               xe->info.media_verx100 <= r->ver_end &&
+                               (!has_samedia(xe) || xe_gt_is_media_type(gt));
                        break;
                case XE_RTP_MATCH_MEDIA_STEP:
                        match = xe->info.step.media >= r->step_start &&
-                               xe->info.step.media < r->step_end;
+                               xe->info.step.media < r->step_end &&
+                               (!has_samedia(xe) || xe_gt_is_media_type(gt));
                        break;
                case XE_RTP_MATCH_INTEGRATED:
                        match = !xe->info.is_dgfx;