OSDN Git Service

drm/msm/adreno: Convert the show/crash file format
authorJordan Crouse <jcrouse@codeaurora.org>
Tue, 24 Jul 2018 16:33:28 +0000 (10:33 -0600)
committerRob Clark <robdclark@gmail.com>
Mon, 30 Jul 2018 12:50:00 +0000 (08:50 -0400)
Convert the format of the 'show' debugfs file and the crash
dump to a  format resembling YAML. This should be easier to
parse and be more flexible for future changes and expansions.

v2: Use a standard .rst for the msm crashdump documentation

Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
Documentation/gpu/msm-crash-dump.rst [new file with mode: 0644]
drivers/gpu/drm/msm/adreno/adreno_gpu.c

diff --git a/Documentation/gpu/msm-crash-dump.rst b/Documentation/gpu/msm-crash-dump.rst
new file mode 100644 (file)
index 0000000..75ab1d5
--- /dev/null
@@ -0,0 +1,71 @@
+=====================
+MSM Crash Dump Format
+=====================
+
+Following a GPU hang the MSM driver outputs debugging information via
+/sys/kernel/dri/X/show or via devcoredump (/sys/class/devcoredump/dcdX/data).
+This document describes how the output is formatted.
+
+Each entry is in the form key: value. Sections headers will not have a value
+and all the contents of a section will be indented two spaces from the header.
+Each section might have multiple array entries the start of which is designated
+by a (-).
+
+Mappings
+--------
+
+kernel
+       The kernel version that generated the dump (UTS_RELEASE).
+
+module
+       The module that generated the crashdump.
+
+time
+       The kernel time at crash formated as seconds.microseconds.
+
+comm
+       Comm string for the binary that generated the fault.
+
+cmdline
+       Command line for the binary that generated the fault.
+
+revision
+       ID of the GPU that generated the crash formatted as
+       core.major.minor.patchlevel separated by dots.
+
+rbbm-status
+       The current value of RBBM_STATUS which shows what top level GPU
+       components are in use at the time of crash.
+
+ringbuffer
+       Section containing the contents of each ringbuffer. Each ringbuffer is
+       identified with an id number.
+
+       id
+               Ringbuffer ID (0 based index).  Each ringbuffer in the section
+               will have its own unique id.
+       iova
+               GPU address of the ringbuffer.
+
+       last-fence
+               The last fence that was issued on the ringbuffer
+
+       retired-fence
+               The last fence retired on the ringbuffer.
+
+       rptr
+               The current read pointer (rptr) for the ringbuffer.
+
+       wptr
+               The current write pointer (wptr) for the ringbuffer.
+
+registers
+       Set of registers values. Each entry is on its own line enclosed
+       by brackets { }.
+
+       offset
+               Byte offset of the register from the start of the
+               GPU memory region.
+
+       value
+               Hexadecimal value of the register.
index c72e3af..c7a998d 100644 (file)
@@ -445,23 +445,28 @@ void adreno_show(struct msm_gpu *gpu, struct msm_gpu_state *state,
        if (IS_ERR_OR_NULL(state))
                return;
 
-       drm_printf(p, "status:   %08x\n", state->rbbm_status);
        drm_printf(p, "revision: %d (%d.%d.%d.%d)\n",
                        adreno_gpu->info->revn, adreno_gpu->rev.core,
                        adreno_gpu->rev.major, adreno_gpu->rev.minor,
                        adreno_gpu->rev.patchid);
 
-       for (i = 0; i < gpu->nr_rings; i++) {
-               drm_printf(p, "rb %d: fence:    %d/%d\n", i,
-                       state->ring[i].fence, state->ring[i].seqno);
+       drm_printf(p, "rbbm-status: 0x%08x\n", state->rbbm_status);
+
+       drm_puts(p, "ringbuffer:\n");
 
-               drm_printf(p, "      rptr:     %d\n", state->ring[i].rptr);
-               drm_printf(p, "rb wptr:  %d\n", state->ring[i].wptr);
+       for (i = 0; i < gpu->nr_rings; i++) {
+               drm_printf(p, "  - id: %d\n", i);
+               drm_printf(p, "    iova: 0x%016llx\n", state->ring[i].iova);
+               drm_printf(p, "    last-fence: %d\n", state->ring[i].seqno);
+               drm_printf(p, "    retired-fence: %d\n", state->ring[i].fence);
+               drm_printf(p, "    rptr: %d\n", state->ring[i].rptr);
+               drm_printf(p, "    wptr: %d\n", state->ring[i].wptr);
        }
 
-       drm_printf(p, "IO:region %s 00000000 00020000\n", gpu->name);
+       drm_puts(p, "registers:\n");
+
        for (i = 0; i < state->nr_registers; i++) {
-               drm_printf(p, "IO:R %08x %08x\n",
+               drm_printf(p, "  - { offset: 0x%04x, value: 0x%08x }\n",
                        state->registers[i * 2] << 2,
                        state->registers[(i * 2) + 1]);
        }