drm/xe: Move lrc snapshot capturing to xe_lrc.c
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Tue, 27 Feb 2024 13:12:45 +0000 (14:12 +0100)
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Mon, 4 Mar 2024 11:23:12 +0000 (12:23 +0100)
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
drivers/gpu/drm/xe/xe_guc_submit.c
drivers/gpu/drm/xe/xe_guc_submit_types.h
drivers/gpu/drm/xe/xe_lrc.c
drivers/gpu/drm/xe/xe_lrc.h
drivers/gpu/drm/xe/xe_lrc_types.h

index 29748e40555fc1d3359ff5fc9ba9b39b4a6d3e8b..ed5c811208b2df990ac3c712009668f33ffbcec6 100644 (file)
@@ -1820,21 +1820,14 @@ xe_guc_exec_queue_snapshot_capture(struct xe_sched_job *job)
        snapshot->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);
 
        if (snapshot->lrc) {
                for (i = 0; i < q->width; ++i) {
                        struct xe_lrc *lrc = q->lrc + i;
 
-                       snapshot->lrc[i].context_desc =
-                               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);
+                       snapshot->lrc[i] = xe_lrc_snapshot_capture(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",
                   snapshot->sched_props.preempt_timeout_us);
 
-       for (i = 0; snapshot->lrc && i < snapshot->width; ++i) {
-               drm_printf(p, "\tHW Context Desc: 0x%08x\n",
-                          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);
-       }
+       for (i = 0; snapshot->lrc && i < snapshot->width; ++i)
+               xe_lrc_snapshot_print(snapshot->lrc[i], p);
+
        drm_printf(p, "\tSchedule State: 0x%x\n", snapshot->schedule_state);
        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)
 {
+       int i;
        if (!snapshot)
                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);
 }
index 72fc0f42b0a5df33710989288c27b88a97833990..dc7456c345836fa525196fa432bd286f6a5ab4bc 100644 (file)
@@ -61,17 +61,6 @@ struct guc_submit_parallel_scratch {
        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 {
        u32 seqno;
        bool fence;
@@ -109,7 +98,7 @@ struct xe_guc_submit_exec_queue_snapshot {
        } sched_props;
 
        /** @lrc: LRC Snapshot */
-       struct lrc_snapshot *lrc;
+       struct xe_lrc_snapshot **lrc;
 
        /** @schedule_state: Schedule State at the moment of Crash */
        u32 schedule_state;
index 6c675d1bcb5771388b577e2d73a06e338185f643..046d954a26c38b8fbf85a28755e8aa13819ed95a 100644 (file)
 #define ENGINE_CLASS_SHIFT                     61
 #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 *
 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;
        }
 }
+
+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);
+}
index 28b1d3f404d4ff4876c4c58af382d48d453963ca..d6dd4045d6d7d6b31f9945e6a9c079d1a790fda4 100644 (file)
@@ -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);
 
+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
index 24f20ed66fd1343ff98c737118675ae30ecd0d8f..b716df0dfb4e3df1d6326e249f889bbd6bdb0b9a 100644 (file)
@@ -43,4 +43,6 @@ struct xe_lrc {
        struct xe_hw_fence_ctx fence_ctx;
 };
 
+struct xe_lrc_snapshot;
+
 #endif