]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/memirq: Dump all source pages if MSI-X
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Mon, 18 May 2026 19:25:45 +0000 (21:25 +0200)
committerMichal Wajdeczko <michal.wajdeczko@intel.com>
Tue, 19 May 2026 08:50:30 +0000 (10:50 +0200)
When using MSI-X, engines report their source/status on separate
MEMIRQ pages, so we need to dump additional source pages, not just
the first one.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Ilia Levi <ilia.levi@intel.com>
Reviewed-by: Ilia Levi <ilia.levi@intel.com>
Link: https://patch.msgid.link/20260518192547.600-8-michal.wajdeczko@intel.com
drivers/gpu/drm/xe/xe_memirq.c
drivers/gpu/drm/xe/xe_memirq_types.h

index 8dabd6744af9a98880910feac4e3b7d209b23643..609e0f3220cc9f0219bd967537ee07c3cae515fd 100644 (file)
@@ -221,6 +221,7 @@ static int memirq_alloc_pages(struct xe_memirq *memirq)
        memirq->source = IOSYS_MAP_INIT_OFFSET(&bo->vmap, XE_MEMIRQ_SOURCE_OFFSET(0));
        memirq->status = IOSYS_MAP_INIT_OFFSET(&bo->vmap, XE_MEMIRQ_STATUS_OFFSET(0));
        memirq->mask = IOSYS_MAP_INIT_OFFSET(&bo->vmap, XE_MEMIRQ_ENABLE_OFFSET);
+       memirq->num_pages = num_pages;
 
        memirq_assert(memirq, !memirq->source.is_iomem);
        memirq_assert(memirq, !memirq->status.is_iomem);
@@ -532,6 +533,18 @@ bool xe_memirq_guc_sw_int_0_irq_pending(struct xe_memirq *memirq, struct xe_guc
                                       guc_name(guc));
 }
 
+static void memirq_dump_source_pages(struct xe_memirq *memirq)
+{
+       memirq_assert(memirq, !memirq->bo->vmap.is_iomem);
+
+       for (int n = 0; n < memirq->num_pages; n++) {
+               memirq_debug(memirq, "SOURCE %*ph\n", 32,
+                            memirq->bo->vmap.vaddr + XE_MEMIRQ_SOURCE_OFFSET(n));
+               memirq_debug(memirq, "SOURCE %*ph\n", 32,
+                            memirq->bo->vmap.vaddr + XE_MEMIRQ_SOURCE_OFFSET(n) + 32);
+       }
+}
+
 /**
  * xe_memirq_handler - The `Memory Based Interrupts`_ Handler.
  * @memirq: the &xe_memirq
@@ -551,9 +564,8 @@ void xe_memirq_handler(struct xe_memirq *memirq)
        if (!memirq->bo)
                return;
 
-       memirq_assert(memirq, !memirq->source.is_iomem);
-       memirq_debug(memirq, "SOURCE %*ph\n", 32, memirq->source.vaddr);
-       memirq_debug(memirq, "SOURCE %*ph\n", 32, memirq->source.vaddr + 32);
+       if (IS_ENABLED(CONFIG_DRM_XE_DEBUG_MEMIRQ))
+               memirq_dump_source_pages(memirq);
 
        for_each_gt(gt, xe, gtid) {
                if (gt->tile != tile)
index 02ac938cadb4a2ab9e2fd0b8b0015cdba91c7cf8..eab3843428780f2896952346b3aed662bb45d586 100644 (file)
@@ -14,6 +14,7 @@ struct xe_bo;
  * struct xe_memirq - Data used by the `Memory Based Interrupts`_.
  *
  * @bo: buffer object with `Memory Based Interrupts Page Layout`_.
+ * @num_pages: number of per-instance source/status pages.
  * @source: iosys pointer to `Interrupt Source Report Page`_.
  * @status: iosys pointer to `Interrupt Status Report Page`_.
  * @mask: iosys pointer to Interrupt Enable Mask.
@@ -21,6 +22,7 @@ struct xe_bo;
  */
 struct xe_memirq {
        struct xe_bo *bo;
+       unsigned int num_pages;
        struct iosys_map source;
        struct iosys_map status;
        struct iosys_map mask;