Commit 47058633 authored by Maarten Lankhorst's avatar Maarten Lankhorst

drm/xe: Move lrc snapshot capturing to xe_lrc.c

This allows the dumping of HWSP and HW Context without exporting more
functions.

Changes since v1:
- GFP_KERNEL -> GFP_NOWAIT. (Souza)
Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240227131248.92910-1-maarten.lankhorst@linux.intel.com
parent 5224ed58
...@@ -1820,21 +1820,14 @@ xe_guc_exec_queue_snapshot_capture(struct xe_sched_job *job) ...@@ -1820,21 +1820,14 @@ xe_guc_exec_queue_snapshot_capture(struct xe_sched_job *job)
snapshot->sched_props.preempt_timeout_us = snapshot->sched_props.preempt_timeout_us =
q->sched_props.preempt_timeout_us; q->sched_props.preempt_timeout_us;
snapshot->lrc = kmalloc_array(q->width, sizeof(struct lrc_snapshot), snapshot->lrc = kmalloc_array(q->width, sizeof(struct xe_lrc_snapshot *),
GFP_ATOMIC); GFP_ATOMIC);
if (snapshot->lrc) { if (snapshot->lrc) {
for (i = 0; i < q->width; ++i) { for (i = 0; i < q->width; ++i) {
struct xe_lrc *lrc = q->lrc + i; struct xe_lrc *lrc = q->lrc + i;
snapshot->lrc[i].context_desc = snapshot->lrc[i] = xe_lrc_snapshot_capture(lrc);
lower_32_bits(xe_lrc_ggtt_addr(lrc));
snapshot->lrc[i].head = xe_lrc_ring_head(lrc);
snapshot->lrc[i].tail.internal = lrc->ring.tail;
snapshot->lrc[i].tail.memory =
xe_lrc_read_ctx_reg(lrc, CTX_RING_TAIL);
snapshot->lrc[i].start_seqno = xe_lrc_start_seqno(lrc);
snapshot->lrc[i].seqno = xe_lrc_seqno(lrc);
} }
} }
...@@ -1900,18 +1893,9 @@ xe_guc_exec_queue_snapshot_print(struct xe_guc_submit_exec_queue_snapshot *snaps ...@@ -1900,18 +1893,9 @@ xe_guc_exec_queue_snapshot_print(struct xe_guc_submit_exec_queue_snapshot *snaps
drm_printf(p, "\tPreempt timeout: %u (us)\n", drm_printf(p, "\tPreempt timeout: %u (us)\n",
snapshot->sched_props.preempt_timeout_us); snapshot->sched_props.preempt_timeout_us);
for (i = 0; snapshot->lrc && i < snapshot->width; ++i) { for (i = 0; snapshot->lrc && i < snapshot->width; ++i)
drm_printf(p, "\tHW Context Desc: 0x%08x\n", xe_lrc_snapshot_print(snapshot->lrc[i], p);
snapshot->lrc[i].context_desc);
drm_printf(p, "\tLRC Head: (memory) %u\n",
snapshot->lrc[i].head);
drm_printf(p, "\tLRC Tail: (internal) %u, (memory) %u\n",
snapshot->lrc[i].tail.internal,
snapshot->lrc[i].tail.memory);
drm_printf(p, "\tStart seqno: (memory) %d\n",
snapshot->lrc[i].start_seqno);
drm_printf(p, "\tSeqno: (memory) %d\n", snapshot->lrc[i].seqno);
}
drm_printf(p, "\tSchedule State: 0x%x\n", snapshot->schedule_state); drm_printf(p, "\tSchedule State: 0x%x\n", snapshot->schedule_state);
drm_printf(p, "\tFlags: 0x%lx\n", snapshot->exec_queue_flags); drm_printf(p, "\tFlags: 0x%lx\n", snapshot->exec_queue_flags);
...@@ -1936,10 +1920,15 @@ xe_guc_exec_queue_snapshot_print(struct xe_guc_submit_exec_queue_snapshot *snaps ...@@ -1936,10 +1920,15 @@ xe_guc_exec_queue_snapshot_print(struct xe_guc_submit_exec_queue_snapshot *snaps
*/ */
void xe_guc_exec_queue_snapshot_free(struct xe_guc_submit_exec_queue_snapshot *snapshot) void xe_guc_exec_queue_snapshot_free(struct xe_guc_submit_exec_queue_snapshot *snapshot)
{ {
int i;
if (!snapshot) if (!snapshot)
return; return;
kfree(snapshot->lrc); if (snapshot->lrc) {
for (i = 0; i < snapshot->width; i++)
xe_lrc_snapshot_free(snapshot->lrc[i]);
kfree(snapshot->lrc);
}
kfree(snapshot->pending_list); kfree(snapshot->pending_list);
kfree(snapshot); kfree(snapshot);
} }
......
...@@ -61,17 +61,6 @@ struct guc_submit_parallel_scratch { ...@@ -61,17 +61,6 @@ struct guc_submit_parallel_scratch {
u32 wq[WQ_SIZE / sizeof(u32)]; u32 wq[WQ_SIZE / sizeof(u32)];
}; };
struct lrc_snapshot {
u32 context_desc;
u32 head;
struct {
u32 internal;
u32 memory;
} tail;
u32 start_seqno;
u32 seqno;
};
struct pending_list_snapshot { struct pending_list_snapshot {
u32 seqno; u32 seqno;
bool fence; bool fence;
...@@ -109,7 +98,7 @@ struct xe_guc_submit_exec_queue_snapshot { ...@@ -109,7 +98,7 @@ struct xe_guc_submit_exec_queue_snapshot {
} sched_props; } sched_props;
/** @lrc: LRC Snapshot */ /** @lrc: LRC Snapshot */
struct lrc_snapshot *lrc; struct xe_lrc_snapshot **lrc;
/** @schedule_state: Schedule State at the moment of Crash */ /** @schedule_state: Schedule State at the moment of Crash */
u32 schedule_state; u32 schedule_state;
......
...@@ -32,6 +32,17 @@ ...@@ -32,6 +32,17 @@
#define ENGINE_CLASS_SHIFT 61 #define ENGINE_CLASS_SHIFT 61
#define ENGINE_INSTANCE_SHIFT 48 #define ENGINE_INSTANCE_SHIFT 48
struct xe_lrc_snapshot {
u32 context_desc;
u32 head;
struct {
u32 internal;
u32 memory;
} tail;
u32 start_seqno;
u32 seqno;
};
static struct xe_device * static struct xe_device *
lrc_to_xe(struct xe_lrc *lrc) lrc_to_xe(struct xe_lrc *lrc)
{ {
...@@ -1331,3 +1342,37 @@ void xe_lrc_emit_hwe_state_instructions(struct xe_exec_queue *q, struct xe_bb *b ...@@ -1331,3 +1342,37 @@ void xe_lrc_emit_hwe_state_instructions(struct xe_exec_queue *q, struct xe_bb *b
bb->len += num_dw; bb->len += num_dw;
} }
} }
struct xe_lrc_snapshot *xe_lrc_snapshot_capture(struct xe_lrc *lrc)
{
struct xe_lrc_snapshot *snapshot = kmalloc(sizeof(*snapshot), GFP_NOWAIT);
if (!snapshot)
return NULL;
snapshot->context_desc = lower_32_bits(xe_lrc_ggtt_addr(lrc));
snapshot->head = xe_lrc_ring_head(lrc);
snapshot->tail.internal = lrc->ring.tail;
snapshot->tail.memory = xe_lrc_read_ctx_reg(lrc, CTX_RING_TAIL);
snapshot->start_seqno = xe_lrc_start_seqno(lrc);
snapshot->seqno = xe_lrc_seqno(lrc);
return snapshot;
}
void xe_lrc_snapshot_print(struct xe_lrc_snapshot *snapshot, struct drm_printer *p)
{
if (!snapshot)
return;
drm_printf(p, "\tHW Context Desc: 0x%08x\n", snapshot->context_desc);
drm_printf(p, "\tLRC Head: (memory) %u\n", snapshot->head);
drm_printf(p, "\tLRC Tail: (internal) %u, (memory) %u\n",
snapshot->tail.internal, snapshot->tail.memory);
drm_printf(p, "\tStart seqno: (memory) %d\n", snapshot->start_seqno);
drm_printf(p, "\tSeqno: (memory) %d\n", snapshot->seqno);
}
void xe_lrc_snapshot_free(struct xe_lrc_snapshot *snapshot)
{
kfree(snapshot);
}
...@@ -55,4 +55,8 @@ void xe_lrc_dump_default(struct drm_printer *p, ...@@ -55,4 +55,8 @@ void xe_lrc_dump_default(struct drm_printer *p,
void xe_lrc_emit_hwe_state_instructions(struct xe_exec_queue *q, struct xe_bb *bb); void xe_lrc_emit_hwe_state_instructions(struct xe_exec_queue *q, struct xe_bb *bb);
struct xe_lrc_snapshot *xe_lrc_snapshot_capture(struct xe_lrc *lrc);
void xe_lrc_snapshot_print(struct xe_lrc_snapshot *snapshot, struct drm_printer *p);
void xe_lrc_snapshot_free(struct xe_lrc_snapshot *snapshot);
#endif #endif
...@@ -43,4 +43,6 @@ struct xe_lrc { ...@@ -43,4 +43,6 @@ struct xe_lrc {
struct xe_hw_fence_ctx fence_ctx; struct xe_hw_fence_ctx fence_ctx;
}; };
struct xe_lrc_snapshot;
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment