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);
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
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)
* 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.
*/
struct xe_memirq {
struct xe_bo *bo;
+ unsigned int num_pages;
struct iosys_map source;
struct iosys_map status;
struct iosys_map mask;