mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
drm/xe/memirq: Dump all source pages if MSI-X
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
This commit is contained in:
parent
becd6a78b5
commit
4c3077da4e
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user