Jiri Slaby ef7db2
From: Matt Roper <matthew.d.roper@intel.com>
Jiri Slaby ef7db2
Date: Wed, 25 Jan 2023 15:41:58 -0800
Jiri Slaby ef7db2
Subject: [PATCH] drm/i915/mtl: Correct implementation of Wa_18018781329
Jiri Slaby ef7db2
References: bsc#1012628
Jiri Slaby ef7db2
Patch-mainline: 6.2.3
Jiri Slaby ef7db2
Git-commit: eda94a6e6a4f2d3d1574ff4f2bd4b9f844504f71
Jiri Slaby ef7db2
Jiri Slaby ef7db2
[ Upstream commit eda94a6e6a4f2d3d1574ff4f2bd4b9f844504f71 ]
Jiri Slaby ef7db2
Jiri Slaby ef7db2
Workaround Wa_18018781329 has applied to several recent Xe_HP-based
Jiri Slaby ef7db2
platforms.  However there are some extra gotchas to implementing this
Jiri Slaby ef7db2
properly for MTL that we need to take into account:
Jiri Slaby ef7db2
Jiri Slaby ef7db2
 * Due to the separation of media and render/compute into separate GTs,
Jiri Slaby ef7db2
   this workaround needs to be implemented on each GT, not just the
Jiri Slaby ef7db2
   primary GT.  Since each class of register only exists on one of the
Jiri Slaby ef7db2
   two GTs, we should program the appropriate registers on each GT.
Jiri Slaby ef7db2
Jiri Slaby ef7db2
 * As with past Xe_HP platforms, the registers on the primary GT (Xe_LPG
Jiri Slaby ef7db2
   IP) are multicast/replicated registers and should be handled with the
Jiri Slaby ef7db2
   MCR-aware functions.  However the registers on the media GT (Xe_LPM+
Jiri Slaby ef7db2
   IP) are regular singleton registers and should _not_ use MCR
Jiri Slaby ef7db2
   handling.  We need to create separate register definitions for the
Jiri Slaby ef7db2
   Xe_HP multicast form and the Xe_LPM+ singleton form and use each in
Jiri Slaby ef7db2
   the appropriate place.
Jiri Slaby ef7db2
Jiri Slaby ef7db2
 * Starting with MTL, workarounds documented by the hardware teams are
Jiri Slaby ef7db2
   technically associated with IP versions/steppings rather than
Jiri Slaby ef7db2
   top-level platforms.  That means we should take care to check the
Jiri Slaby ef7db2
   media IP version rather than the graphics IP version when deciding
Jiri Slaby ef7db2
   whether the workaround is needed on the Xe_LPM+ media GT (in this
Jiri Slaby ef7db2
   case the workaround applies to both IPs and the stepping bounds are
Jiri Slaby ef7db2
   identical, but we should still write the code appropriately to set a
Jiri Slaby ef7db2
   proper precedent for future workaround implementations).
Jiri Slaby ef7db2
Jiri Slaby ef7db2
 * It's worth noting that the GSC register and the CCS register are
Jiri Slaby ef7db2
   defined with the same MMIO offset (0xCF30).  Since the CCS is only
Jiri Slaby ef7db2
   relevant to the primary GT and the GSC is only relevant to the media
Jiri Slaby ef7db2
   GT there isn't actually a clash here (the media GT automatically adds
Jiri Slaby ef7db2
   the additional 0x380000 GSI offset).  However there's currently a
Jiri Slaby ef7db2
   glitch in the bspec where the CCS register doesn't show up at all and
Jiri Slaby ef7db2
   the GSC register is listed as existing on both GTs.  That's a known
Jiri Slaby ef7db2
   documentation problem for several registers with shared GSC/CCS
Jiri Slaby ef7db2
   offsets; rest assured that the CCS register really does still exist.
Jiri Slaby ef7db2
Jiri Slaby ef7db2
Cc: Gustavo Sousa <gustavo.sousa@intel.com>
Jiri Slaby ef7db2
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Jiri Slaby ef7db2
Fixes: 41bb543f5598 ("drm/i915/mtl: Add initial gt workarounds")
Jiri Slaby ef7db2
Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Jiri Slaby ef7db2
Link: https://patchwork.freedesktop.org/patch/msgid/20230125234159.3015385-2-matthew.d.roper@intel.com
Jiri Slaby ef7db2
Signed-off-by: Sasha Levin <sashal@kernel.org>
Jiri Slaby ef7db2
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Jiri Slaby ef7db2
---
Jiri Slaby ef7db2
 drivers/gpu/drm/i915/gt/intel_gt_regs.h     |  7 +++++--
Jiri Slaby ef7db2
 drivers/gpu/drm/i915/gt/intel_workarounds.c | 22 ++++++++++++++-------
Jiri Slaby ef7db2
 drivers/gpu/drm/i915/i915_drv.h             |  4 ++++
Jiri Slaby ef7db2
 3 files changed, 24 insertions(+), 9 deletions(-)
Jiri Slaby ef7db2
Jiri Slaby ef7db2
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_regs.h b/drivers/gpu/drm/i915/gt/intel_gt_regs.h
Jiri Slaby ef7db2
index 3b6ef0eb..9758b0b6 100644
Jiri Slaby ef7db2
--- a/drivers/gpu/drm/i915/gt/intel_gt_regs.h
Jiri Slaby ef7db2
+++ b/drivers/gpu/drm/i915/gt/intel_gt_regs.h
Jiri Slaby ef7db2
@@ -1087,8 +1087,11 @@
Jiri Slaby ef7db2
 #define XEHP_MERT_MOD_CTRL			MCR_REG(0xcf28)
Jiri Slaby ef7db2
 #define RENDER_MOD_CTRL				MCR_REG(0xcf2c)
Jiri Slaby ef7db2
 #define COMP_MOD_CTRL				MCR_REG(0xcf30)
Jiri Slaby ef7db2
-#define VDBX_MOD_CTRL				MCR_REG(0xcf34)
Jiri Slaby ef7db2
-#define VEBX_MOD_CTRL				MCR_REG(0xcf38)
Jiri Slaby ef7db2
+#define XELPMP_GSC_MOD_CTRL			_MMIO(0xcf30)	/* media GT only */
Jiri Slaby ef7db2
+#define XEHP_VDBX_MOD_CTRL			MCR_REG(0xcf34)
Jiri Slaby ef7db2
+#define XELPMP_VDBX_MOD_CTRL			_MMIO(0xcf34)
Jiri Slaby ef7db2
+#define XEHP_VEBX_MOD_CTRL			MCR_REG(0xcf38)
Jiri Slaby ef7db2
+#define XELPMP_VEBX_MOD_CTRL			_MMIO(0xcf38)
Jiri Slaby ef7db2
 #define   FORCE_MISS_FTLB			REG_BIT(3)
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 #define XEHP_GAMSTLB_CTRL			MCR_REG(0xcf4c)
Jiri Slaby ef7db2
diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c b/drivers/gpu/drm/i915/gt/intel_workarounds.c
Jiri Slaby ef7db2
index d92b006d..e13052c5 100644
Jiri Slaby ef7db2
--- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
Jiri Slaby ef7db2
+++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
Jiri Slaby ef7db2
@@ -1678,8 +1678,8 @@ dg2_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
Jiri Slaby ef7db2
 	/* Wa_18018781329 */
Jiri Slaby ef7db2
 	wa_mcr_write_or(wal, RENDER_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
 	wa_mcr_write_or(wal, COMP_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
-	wa_mcr_write_or(wal, VDBX_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
-	wa_mcr_write_or(wal, VEBX_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
+	wa_mcr_write_or(wal, XEHP_VDBX_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
+	wa_mcr_write_or(wal, XEHP_VEBX_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	/* Wa_1509235366:dg2 */
Jiri Slaby ef7db2
 	wa_mcr_write_or(wal, XEHP_GAMCNTRL_CTRL,
Jiri Slaby ef7db2
@@ -1697,8 +1697,8 @@ pvc_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
Jiri Slaby ef7db2
 	/* Wa_18018781329 */
Jiri Slaby ef7db2
 	wa_mcr_write_or(wal, RENDER_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
 	wa_mcr_write_or(wal, COMP_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
-	wa_mcr_write_or(wal, VDBX_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
-	wa_mcr_write_or(wal, VEBX_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
+	wa_mcr_write_or(wal, XEHP_VDBX_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
+	wa_mcr_write_or(wal, XEHP_VEBX_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
 }
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 static void
Jiri Slaby ef7db2
@@ -1712,8 +1712,6 @@ xelpg_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
Jiri Slaby ef7db2
 		/* Wa_18018781329 */
Jiri Slaby ef7db2
 		wa_mcr_write_or(wal, RENDER_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
 		wa_mcr_write_or(wal, COMP_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
-		wa_mcr_write_or(wal, VDBX_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
-		wa_mcr_write_or(wal, VEBX_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
 	}
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	/*
Jiri Slaby ef7db2
@@ -1726,7 +1724,17 @@ xelpg_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
Jiri Slaby ef7db2
 static void
Jiri Slaby ef7db2
 xelpmp_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
Jiri Slaby ef7db2
 {
Jiri Slaby ef7db2
-	/* FIXME: Actual workarounds will be added in future patch(es) */
Jiri Slaby ef7db2
+	if (IS_MTL_MEDIA_STEP(gt->i915, STEP_A0, STEP_B0)) {
Jiri Slaby ef7db2
+		/*
Jiri Slaby ef7db2
+		 * Wa_18018781329
Jiri Slaby ef7db2
+		 *
Jiri Slaby ef7db2
+		 * Note that although these registers are MCR on the primary
Jiri Slaby ef7db2
+		 * GT, the media GT's versions are regular singleton registers.
Jiri Slaby ef7db2
+		 */
Jiri Slaby ef7db2
+		wa_write_or(wal, XELPMP_GSC_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
+		wa_write_or(wal, XELPMP_VDBX_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
+		wa_write_or(wal, XELPMP_VEBX_MOD_CTRL, FORCE_MISS_FTLB);
Jiri Slaby ef7db2
+	}
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	debug_dump_steering(gt);
Jiri Slaby ef7db2
 }
Jiri Slaby ef7db2
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
Jiri Slaby ef7db2
index a380db36..03c3a59d 100644
Jiri Slaby ef7db2
--- a/drivers/gpu/drm/i915/i915_drv.h
Jiri Slaby ef7db2
+++ b/drivers/gpu/drm/i915/i915_drv.h
Jiri Slaby ef7db2
@@ -726,6 +726,10 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
Jiri Slaby ef7db2
 	(IS_SUBPLATFORM(__i915, INTEL_METEORLAKE, INTEL_SUBPLATFORM_##variant) && \
Jiri Slaby ef7db2
 	 IS_GRAPHICS_STEP(__i915, since, until))
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
+#define IS_MTL_MEDIA_STEP(__i915, since, until) \
Jiri Slaby ef7db2
+	(IS_METEORLAKE(__i915) && \
Jiri Slaby ef7db2
+	 IS_MEDIA_STEP(__i915, since, until))
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
 /*
Jiri Slaby ef7db2
  * DG2 hardware steppings are a bit unusual.  The hardware design was forked to
Jiri Slaby ef7db2
  * create three variants (G10, G11, and G12) which each have distinct
Jiri Slaby ef7db2
-- 
Jiri Slaby ef7db2
2.35.3
Jiri Slaby ef7db2