@@ -2536,7 +2536,7 @@ gen12_gt_hw_error_handler(struct drm_i915_private * const i915,
{
void __iomem * const regs = i915->uncore.regs;
const char *hw_err_str = hardware_error_type_to_str(hw_err);
- u32 other_errors = ~(EU_GRF_ERROR | EU_IC_ERROR);
+ u32 other_errors = ~(EU_GRF_ERROR | EU_IC_ERROR | SLM_ERROR);
u32 errstat;
lockdep_assert_held(&i915->irq_lock);
@@ -2565,6 +2565,14 @@ gen12_gt_hw_error_handler(struct drm_i915_private * const i915,
if (errstat & EU_IC_ERROR)
DRM_ERROR("detected EU IC %s hardware error\n", hw_err_str);
+ if (errstat & SLM_ERROR) {
+ struct drm_i915_private *dev_priv = i915;
+
+ DRM_ERROR("detected %u SLM %s hardware error(s)\n",
+ I915_READ(SLM_ECC_ERROR_CNTR(hw_err)),
+ hw_err_str);
+ }
+
/*
* TODO: The remaining GT errors don't have a
* need for targeted logging at the moment. We
@@ -7765,6 +7765,13 @@ enum hardware_error {
_ERR_STAT_GT_NONFATAL))
#define EU_GRF_ERROR (1 << 15)
#define EU_IC_ERROR (1 << 14)
+#define SLM_ERROR (1 << 13)
+
+#define _SLM_ECC_ERROR_CNT 0xe7f4
+#define _SLM_UNCORR_ECC_ERROR_CNT 0xe7c0
+#define SLM_ECC_ERROR_CNTR(x) _MMIO((x) == HARDWARE_ERROR_CORRECTABLE ? \
+ _SLM_ECC_ERROR_CNT : \
+ _SLM_UNCORR_ECC_ERROR_CNT)
#define GEN11_RENDER_COPY_INTR_ENABLE _MMIO(0x190030)
#define GEN11_VCS_VECS_INTR_ENABLE _MMIO(0x190034)