]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe/pf: Handle MERT catastrophic errors
authorLukasz Laguna <lukasz.laguna@intel.com>
Mon, 24 Nov 2025 19:02:37 +0000 (20:02 +0100)
committerMichal Wajdeczko <michal.wajdeczko@intel.com>
Tue, 25 Nov 2025 16:45:28 +0000 (17:45 +0100)
The MERT block triggers an interrupt when a catastrophic error occurs.
Update the interrupt handler to read the MERT catastrophic error type
and log appropriate debug message.

Signed-off-by: Lukasz Laguna <lukasz.laguna@intel.com>
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Link: https://patch.msgid.link/20251124190237.20503-5-lukasz.laguna@intel.com
drivers/gpu/drm/xe/regs/xe_mert_regs.h
drivers/gpu/drm/xe/xe_mert.c

index aef66c04901d24ff0f8aa87a83050ccf2f64e4df..c345e11ceea84f02d7d847043a17bf01fdba2ce1 100644 (file)
 
 #define MERT_LMEM_CFG                          XE_REG(0x1448b0)
 
+#define MERT_TLB_CT_INTR_ERR_ID_PORT           XE_REG(0x145190)
+#define   MERT_TLB_CT_VFID_MASK                        REG_GENMASK(16, 9)
+#define   MERT_TLB_CT_ERROR_MASK               REG_GENMASK(5, 0)
+#define     MERT_TLB_CT_LMTT_FAULT             0x05
+
 #define MERT_TLB_INV_DESC_A                    XE_REG(0x14cf7c)
 #define   MERT_TLB_INV_DESC_A_VALID            REG_BIT(0)
 
index 304cc8421999085a4bbdc80c5aadf53bce163db5..f7689e92295362f74c1c1a5778568a051db1ec1a 100644 (file)
@@ -55,10 +55,21 @@ void xe_mert_irq_handler(struct xe_device *xe, u32 master_ctl)
        struct xe_tile *tile = xe_device_get_root_tile(xe);
        unsigned long flags;
        u32 reg_val;
+       u8 err;
 
        if (!(master_ctl & SOC_H2DMEMINT_IRQ))
                return;
 
+       reg_val = xe_mmio_read32(&tile->mmio, MERT_TLB_CT_INTR_ERR_ID_PORT);
+       xe_mmio_write32(&tile->mmio, MERT_TLB_CT_INTR_ERR_ID_PORT, 0);
+
+       err = FIELD_GET(MERT_TLB_CT_ERROR_MASK, reg_val);
+       if (err == MERT_TLB_CT_LMTT_FAULT)
+               drm_dbg(&xe->drm, "MERT catastrophic error: LMTT fault (VF%u)\n",
+                       FIELD_GET(MERT_TLB_CT_VFID_MASK, reg_val));
+       else if (err)
+               drm_dbg(&xe->drm, "MERT catastrophic error: Unexpected fault (0x%x)\n", err);
+
        spin_lock_irqsave(&tile->mert.lock, flags);
        if (tile->mert.tlb_inv_triggered) {
                reg_val = xe_mmio_read32(&tile->mmio, MERT_TLB_INV_DESC_A);