drm/msm/adreno: Convert the show/crash file format
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>
This commit is contained in:
parent
c0fec7f562
commit
bcf1d9fa5d
71
Documentation/gpu/msm-crash-dump.rst
Normal file
71
Documentation/gpu/msm-crash-dump.rst
Normal file
@ -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.
|
@ -445,23 +445,28 @@ void adreno_show(struct msm_gpu *gpu, struct msm_gpu_state *state,
|
|||||||
if (IS_ERR_OR_NULL(state))
|
if (IS_ERR_OR_NULL(state))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
drm_printf(p, "status: %08x\n", state->rbbm_status);
|
|
||||||
drm_printf(p, "revision: %d (%d.%d.%d.%d)\n",
|
drm_printf(p, "revision: %d (%d.%d.%d.%d)\n",
|
||||||
adreno_gpu->info->revn, adreno_gpu->rev.core,
|
adreno_gpu->info->revn, adreno_gpu->rev.core,
|
||||||
adreno_gpu->rev.major, adreno_gpu->rev.minor,
|
adreno_gpu->rev.major, adreno_gpu->rev.minor,
|
||||||
adreno_gpu->rev.patchid);
|
adreno_gpu->rev.patchid);
|
||||||
|
|
||||||
for (i = 0; i < gpu->nr_rings; i++) {
|
drm_printf(p, "rbbm-status: 0x%08x\n", state->rbbm_status);
|
||||||
drm_printf(p, "rb %d: fence: %d/%d\n", i,
|
|
||||||
state->ring[i].fence, state->ring[i].seqno);
|
|
||||||
|
|
||||||
drm_printf(p, " rptr: %d\n", state->ring[i].rptr);
|
drm_puts(p, "ringbuffer:\n");
|
||||||
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++) {
|
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] << 2,
|
||||||
state->registers[(i * 2) + 1]);
|
state->registers[(i * 2) + 1]);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user