mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-09-02 18:19:06 +00:00
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: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Reviewed-by: José Roberto de Souza <jose.souza@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240227131248.92910-1-maarten.lankhorst@linux.intel.com
This commit is contained in:
parent
5224ed586b
commit
47058633d9
@ -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
|
|||||||
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
|
|||||||
*/
|
*/
|
||||||
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 {
|
|||||||
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 {
|
|||||||
} 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 @@
|
|||||||
#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
|
|||||||
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,
|
|||||||
|
|
||||||
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 {
|
|||||||
struct xe_hw_fence_ctx fence_ctx;
|
struct xe_hw_fence_ctx fence_ctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct xe_lrc_snapshot;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user