Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] drm/xe/eustall: Add workaround 14027094826 to graphics IP 35.11
@ 2026-06-11 23:34 Harish Chegondi
  2026-06-11 23:41 ` ✓ CI.KUnit: success for series starting with [1/1] " Patchwork
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Harish Chegondi @ 2026-06-11 23:34 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Harish Chegondi

Before enabling EU stall sampling, write 0x20 to the SWF scratch pad
register. When the firmware sees this register set to 0x20,
it applies its part of the workaround and sets the scratch pad register
to 0x60.

Before disabling EU stall sampling, write 0x40 to the SWF scratch pad
register. When the firmware sees this register set to 0x40, it reverts
its part of the workaround and sets the scratch pad
register to 0.

Bspec update for the SWF scratch pad register is still pending, but has
been confirmed offline with the firmware team.

Bspec: 53188
Signed-off-by: Harish Chegondi <harish.chegondi@intel.com>
---
 drivers/gpu/drm/xe/regs/xe_gt_regs.h |  3 ++
 drivers/gpu/drm/xe/xe_eu_stall.c     | 46 ++++++++++++++++++++++++++--
 drivers/gpu/drm/xe/xe_wa_oob.rules   |  1 +
 3 files changed, 47 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/xe/regs/xe_gt_regs.h b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
index 08251c7a1a4b..b86050503c4e 100644
--- a/drivers/gpu/drm/xe/regs/xe_gt_regs.h
+++ b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
@@ -616,6 +616,9 @@
 #define   CCS_MODE_CSLICE(cslice, ccs) \
 	((ccs) << ((cslice) * CCS_MODE_CSLICE_WIDTH))
 
+#define SWF_SCRATCHPAD				XE_REG(0x4f000)
+#define   POISON_SUPP_MASK			REG_GENMASK(6, 5)
+
 #define FORCEWAKE_ACK_GT			XE_REG(0x130044)
 
 /* Applicable for all FORCEWAKE_DOMAIN and FORCEWAKE_ACK_DOMAIN regs */
diff --git a/drivers/gpu/drm/xe/xe_eu_stall.c b/drivers/gpu/drm/xe/xe_eu_stall.c
index d37770c58c5d..4d0f97ca4cdb 100644
--- a/drivers/gpu/drm/xe/xe_eu_stall.c
+++ b/drivers/gpu/drm/xe/xe_eu_stall.c
@@ -7,6 +7,7 @@
 #include <linux/fs.h>
 #include <linux/poll.h>
 #include <linux/types.h>
+#include <linux/iopoll.h>
 
 #include <drm/drm_drv.h>
 #include <generated/xe_wa_oob.h>
@@ -20,6 +21,7 @@
 #include "xe_gt_printk.h"
 #include "xe_gt_topology.h"
 #include "xe_macros.h"
+#include "xe_mmio.h"
 #include "xe_observation.h"
 #include "xe_pm.h"
 #include "xe_trace.h"
@@ -682,7 +684,7 @@ static int xe_eu_stall_stream_enable(struct xe_eu_stall_data_stream *stream)
 	struct per_xecore_buf *xecore_buf;
 	struct xe_gt *gt = stream->gt;
 	u16 group, instance;
-	int xecore;
+	int xecore, ret = 0;
 
 	/* Take runtime pm ref and forcewake to disable RC6 */
 	xe_pm_runtime_get(gt_to_xe(gt));
@@ -693,6 +695,26 @@ static int xe_eu_stall_stream_enable(struct xe_eu_stall_data_stream *stream)
 		return -ETIMEDOUT;
 	}
 
+	if (XE_GT_WA(gt, 14027094826)) {
+		/**
+		 * Writing 0x20 to SWF register will signal the firmware to suppress
+		 * poison propagation.
+		 */
+		xe_mmio_write32(&gt->mmio, SWF_SCRATCHPAD, 0x20);
+		/**
+		 * Firmware will write 0x60 to SWF after suppressing poison propagation.
+		 * Wait until the SWF value turns 0x60 before enabling EU stall sampling.
+		 */
+		ret = read_poll_timeout(xe_mmio_read32, reg_value,
+					(reg_value & POISON_SUPP_MASK) == 0x60,
+					1000, 1000000, true, &gt->mmio, SWF_SCRATCHPAD);
+		if (ret) {
+			xe_gt_err(gt, "Time out while firmware is disabling poison propagation\n");
+			xe_force_wake_put(gt_to_fw(gt), stream->fw_ref);
+			xe_pm_runtime_put(gt_to_xe(gt));
+			return ret;
+		}
+	}
 	if (XE_GT_WA(gt, 22016596838))
 		xe_gt_mcr_multicast_write(gt, ROW_CHICKEN2,
 					  REG_MASKED_FIELD_ENABLE(DISABLE_DOP_GATING));
@@ -730,7 +752,7 @@ static int xe_eu_stall_stream_enable(struct xe_eu_stall_data_stream *stream)
 	reg_value |= XEHPC_EUSTALL_BASE_ENABLE_SAMPLING;
 	xe_gt_mcr_multicast_write(gt, XEHPC_EUSTALL_BASE, reg_value);
 
-	return 0;
+	return ret;
 }
 
 static void eu_stall_data_buf_poll_work_fn(struct work_struct *work)
@@ -840,6 +862,8 @@ static int xe_eu_stall_enable_locked(struct xe_eu_stall_data_stream *stream)
 static int xe_eu_stall_disable_locked(struct xe_eu_stall_data_stream *stream)
 {
 	struct xe_gt *gt = stream->gt;
+	u32 reg_value;
+	int ret = 0;
 
 	if (!stream->enabled)
 		return 0;
@@ -853,11 +877,27 @@ static int xe_eu_stall_disable_locked(struct xe_eu_stall_data_stream *stream)
 	if (XE_GT_WA(gt, 22016596838))
 		xe_gt_mcr_multicast_write(gt, ROW_CHICKEN2,
 					  REG_MASKED_FIELD_DISABLE(DISABLE_DOP_GATING));
+	if (XE_GT_WA(gt, 14027094826)) {
+		/**
+		 * Writing 0x40 to SWF register will signal the firmware to enable
+		 * poison propagation.
+		 */
+		xe_mmio_write32(&gt->mmio, SWF_SCRATCHPAD, 0x40);
+		/**
+		 * Firmware will write 0 to SWF after enabling poison propagation.
+		 * Wait until the SWF register value turns 0.
+		 */
+		ret = read_poll_timeout(xe_mmio_read32, reg_value,
+					(reg_value & POISON_SUPP_MASK) == 0,
+					1000, 1000000, true, &gt->mmio, SWF_SCRATCHPAD);
+		if (ret)
+			xe_gt_err(gt, "Time out while firmware is enabling poison propagation\n");
+	}
 
 	xe_force_wake_put(gt_to_fw(gt), stream->fw_ref);
 	xe_pm_runtime_put(gt_to_xe(gt));
 
-	return 0;
+	return ret;
 }
 
 static long xe_eu_stall_stream_ioctl_locked(struct xe_eu_stall_data_stream *stream,
diff --git a/drivers/gpu/drm/xe/xe_wa_oob.rules b/drivers/gpu/drm/xe/xe_wa_oob.rules
index f8a185103b80..293aa83feca7 100644
--- a/drivers/gpu/drm/xe/xe_wa_oob.rules
+++ b/drivers/gpu/drm/xe/xe_wa_oob.rules
@@ -65,3 +65,4 @@
 
 14025883347	MEDIA_VERSION_RANGE(1301, 3503)
 		GRAPHICS_VERSION_RANGE(2004, 3005)
+14027094826	GRAPHICS_VERSION(3511)
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-06-16 22:57 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-11 23:34 [PATCH 1/1] drm/xe/eustall: Add workaround 14027094826 to graphics IP 35.11 Harish Chegondi
2026-06-11 23:41 ` ✓ CI.KUnit: success for series starting with [1/1] " Patchwork
2026-06-12  0:18 ` ✓ Xe.CI.BAT: " Patchwork
2026-06-12 17:34 ` ✓ Xe.CI.FULL: " Patchwork
2026-06-12 21:25 ` [PATCH 1/1] " Matt Roper
2026-06-16 22:57   ` Harish Chegondi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox