|
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 |
|