2 * Copyright (C) 2013 Red Hat
3 * Author: Rob Clark <robdclark@gmail.com>
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 as published by
7 * the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program. If not, see <http://www.gnu.org/licenses/>.
18 /* For debugging crashes, userspace can:
20 * tail -f /sys/kernel/debug/dri/<minor>/rd > logfile.rd
22 * to log the cmdstream in a format that is understood by freedreno/cffdump
23 * utility. By comparing the last successfully completed fence #, to the
24 * cmdstream for the next fence, you can narrow down which process and submit
25 * caused the gpu crash/lockup.
29 * tail -f /sys/kernel/debug/dri/<minor>/hangrd > logfile.rd
31 * will capture just the cmdstream from submits which triggered a GPU hang.
33 * This bypasses drm_debugfs_create_files() mainly because we need to use
34 * our own fops for a bit more control. In particular, we don't want to
35 * do anything if userspace doesn't have the debugfs file open.
37 * The module-param "rd_full", which defaults to false, enables snapshotting
38 * all (non-written) buffers in the submit, rather than just cmdstream bo's.
39 * This is useful to capture the contents of (for example) vbo's or textures,
40 * or shader programs (if not emitted inline in cmdstream).
43 #ifdef CONFIG_DEBUG_FS
45 #include <linux/kfifo.h>
46 #include <linux/debugfs.h>
47 #include <linux/circ_buf.h>
48 #include <linux/wait.h>
54 static bool rd_full
= false;
55 MODULE_PARM_DESC(rd_full
, "If true, $debugfs/.../rd will snapshot all buffer contents");
56 module_param_named(rd_full
, rd_full
, bool, 0600);
60 RD_TEST
, /* ascii text */
61 RD_CMD
, /* ascii text */
62 RD_GPUADDR
, /* u32 gpuaddr, u32 size */
63 RD_CONTEXT
, /* raw dump */
64 RD_CMDSTREAM
, /* raw dump */
65 RD_CMDSTREAM_ADDR
, /* gpu addr of cmdstream */
66 RD_PARAM
, /* u32 param_type, u32 param_val, u32 bitlen */
67 RD_FLUSH
, /* empty, clear previous params */
68 RD_PROGRAM
, /* shader program, raw dump */
75 #define BUF_SZ 512 /* should be power of 2 */
78 #define circ_count(circ) \
79 (CIRC_CNT((circ)->head, (circ)->tail, BUF_SZ))
80 #define circ_count_to_end(circ) \
81 (CIRC_CNT_TO_END((circ)->head, (circ)->tail, BUF_SZ))
82 /* space available: */
83 #define circ_space(circ) \
84 (CIRC_SPACE((circ)->head, (circ)->tail, BUF_SZ))
85 #define circ_space_to_end(circ) \
86 (CIRC_SPACE_TO_END((circ)->head, (circ)->tail, BUF_SZ))
89 struct drm_device
*dev
;
93 /* current submit to read out: */
94 struct msm_gem_submit
*submit
;
96 /* fifo access is synchronized on the producer side by
97 * struct_mutex held by submit code (otherwise we could
98 * end up w/ cmds logged in different order than they
99 * were executed). And read_lock synchronizes the reads
101 struct mutex read_lock
;
103 wait_queue_head_t fifo_event
;
104 struct circ_buf fifo
;
109 static void rd_write(struct msm_rd_state
*rd
, const void *buf
, int sz
)
111 struct circ_buf
*fifo
= &rd
->fifo
;
112 const char *ptr
= buf
;
115 char *fptr
= &fifo
->buf
[fifo
->head
];
118 wait_event(rd
->fifo_event
, circ_space(&rd
->fifo
) > 0 || !rd
->open
);
122 /* Note that smp_load_acquire() is not strictly required
123 * as CIRC_SPACE_TO_END() does not access the tail more
126 n
= min(sz
, circ_space_to_end(&rd
->fifo
));
127 memcpy(fptr
, ptr
, n
);
129 smp_store_release(&fifo
->head
, (fifo
->head
+ n
) & (BUF_SZ
- 1));
133 wake_up_all(&rd
->fifo_event
);
137 static void rd_write_section(struct msm_rd_state
*rd
,
138 enum rd_sect_type type
, const void *buf
, int sz
)
140 rd_write(rd
, &type
, 4);
141 rd_write(rd
, &sz
, 4);
142 rd_write(rd
, buf
, sz
);
145 static ssize_t
rd_read(struct file
*file
, char __user
*buf
,
146 size_t sz
, loff_t
*ppos
)
148 struct msm_rd_state
*rd
= file
->private_data
;
149 struct circ_buf
*fifo
= &rd
->fifo
;
150 const char *fptr
= &fifo
->buf
[fifo
->tail
];
153 mutex_lock(&rd
->read_lock
);
155 ret
= wait_event_interruptible(rd
->fifo_event
,
156 circ_count(&rd
->fifo
) > 0);
160 /* Note that smp_load_acquire() is not strictly required
161 * as CIRC_CNT_TO_END() does not access the head more than
164 n
= min_t(int, sz
, circ_count_to_end(&rd
->fifo
));
165 if (copy_to_user(buf
, fptr
, n
)) {
170 smp_store_release(&fifo
->tail
, (fifo
->tail
+ n
) & (BUF_SZ
- 1));
173 wake_up_all(&rd
->fifo_event
);
176 mutex_unlock(&rd
->read_lock
);
182 static int rd_open(struct inode
*inode
, struct file
*file
)
184 struct msm_rd_state
*rd
= inode
->i_private
;
185 struct drm_device
*dev
= rd
->dev
;
186 struct msm_drm_private
*priv
= dev
->dev_private
;
187 struct msm_gpu
*gpu
= priv
->gpu
;
192 mutex_lock(&dev
->struct_mutex
);
194 if (rd
->open
|| !gpu
) {
199 file
->private_data
= rd
;
202 /* the parsing tools need to know gpu-id to know which
203 * register database to load.
205 gpu
->funcs
->get_param(gpu
, MSM_PARAM_GPU_ID
, &val
);
208 rd_write_section(rd
, RD_GPU_ID
, &gpu_id
, sizeof(gpu_id
));
211 mutex_unlock(&dev
->struct_mutex
);
215 static int rd_release(struct inode
*inode
, struct file
*file
)
217 struct msm_rd_state
*rd
= inode
->i_private
;
220 wake_up_all(&rd
->fifo_event
);
226 static const struct file_operations rd_debugfs_fops
= {
227 .owner
= THIS_MODULE
,
231 .release
= rd_release
,
235 static void rd_cleanup(struct msm_rd_state
*rd
)
240 mutex_destroy(&rd
->read_lock
);
244 static struct msm_rd_state
*rd_init(struct drm_minor
*minor
, const char *name
)
246 struct msm_rd_state
*rd
;
250 rd
= kzalloc(sizeof(*rd
), GFP_KERNEL
);
252 return ERR_PTR(-ENOMEM
);
254 rd
->dev
= minor
->dev
;
255 rd
->fifo
.buf
= rd
->buf
;
257 mutex_init(&rd
->read_lock
);
259 init_waitqueue_head(&rd
->fifo_event
);
261 ent
= debugfs_create_file(name
, S_IFREG
| S_IRUGO
,
262 minor
->debugfs_root
, rd
, &rd_debugfs_fops
);
264 DRM_ERROR("Cannot create /sys/kernel/debug/dri/%pd/%s\n",
265 minor
->debugfs_root
, name
);
277 int msm_rd_debugfs_init(struct drm_minor
*minor
)
279 struct msm_drm_private
*priv
= minor
->dev
->dev_private
;
280 struct msm_rd_state
*rd
;
283 /* only create on first minor: */
287 rd
= rd_init(minor
, "rd");
295 rd
= rd_init(minor
, "hangrd");
306 msm_rd_debugfs_cleanup(priv
);
310 void msm_rd_debugfs_cleanup(struct msm_drm_private
*priv
)
312 rd_cleanup(priv
->rd
);
315 rd_cleanup(priv
->hangrd
);
319 static void snapshot_buf(struct msm_rd_state
*rd
,
320 struct msm_gem_submit
*submit
, int idx
,
321 uint64_t iova
, uint32_t size
)
323 struct msm_gem_object
*obj
= submit
->bos
[idx
].obj
;
328 offset
= iova
- submit
->bos
[idx
].iova
;
330 iova
= submit
->bos
[idx
].iova
;
331 size
= obj
->base
.size
;
335 * Always write the GPUADDR header so can get a complete list of all the
338 rd_write_section(rd
, RD_GPUADDR
,
339 (uint32_t[3]){ iova
, size
, iova
>> 32 }, 12);
341 /* But only dump the contents of buffers marked READ */
342 if (!(submit
->bos
[idx
].flags
& MSM_SUBMIT_BO_READ
))
345 buf
= msm_gem_get_vaddr_active(&obj
->base
);
351 rd_write_section(rd
, RD_BUFFER_CONTENTS
, buf
, size
);
353 msm_gem_put_vaddr(&obj
->base
);
357 should_dump(struct msm_gem_submit
*submit
, int idx
)
359 return rd_full
|| (submit
->bos
[idx
].flags
& MSM_SUBMIT_BO_DUMP
);
362 /* called under struct_mutex */
363 void msm_rd_dump_submit(struct msm_rd_state
*rd
, struct msm_gem_submit
*submit
,
364 const char *fmt
, ...)
366 struct drm_device
*dev
= submit
->dev
;
367 struct task_struct
*task
;
374 /* writing into fifo is serialized by caller, and
375 * rd->read_lock is used to serialize the reads
377 WARN_ON(!mutex_is_locked(&dev
->struct_mutex
));
383 n
= vscnprintf(msg
, sizeof(msg
), fmt
, args
);
386 rd_write_section(rd
, RD_CMD
, msg
, ALIGN(n
, 4));
390 task
= pid_task(submit
->pid
, PIDTYPE_PID
);
392 n
= scnprintf(msg
, sizeof(msg
), "%.*s/%d: fence=%u",
393 TASK_COMM_LEN
, task
->comm
,
394 pid_nr(submit
->pid
), submit
->seqno
);
396 n
= scnprintf(msg
, sizeof(msg
), "???/%d: fence=%u",
397 pid_nr(submit
->pid
), submit
->seqno
);
401 rd_write_section(rd
, RD_CMD
, msg
, ALIGN(n
, 4));
403 for (i
= 0; i
< submit
->nr_bos
; i
++)
404 if (should_dump(submit
, i
))
405 snapshot_buf(rd
, submit
, i
, 0, 0);
407 for (i
= 0; i
< submit
->nr_cmds
; i
++) {
408 uint64_t iova
= submit
->cmd
[i
].iova
;
409 uint32_t szd
= submit
->cmd
[i
].size
; /* in dwords */
411 /* snapshot cmdstream bo's (if we haven't already): */
412 if (!should_dump(submit
, i
)) {
413 snapshot_buf(rd
, submit
, submit
->cmd
[i
].idx
,
414 submit
->cmd
[i
].iova
, szd
* 4);
417 switch (submit
->cmd
[i
].type
) {
418 case MSM_SUBMIT_CMD_IB_TARGET_BUF
:
419 /* ignore IB-targets, we've logged the buffer, the
420 * parser tool will follow the IB based on the logged
421 * buffer/gpuaddr, so nothing more to do.
424 case MSM_SUBMIT_CMD_CTX_RESTORE_BUF
:
425 case MSM_SUBMIT_CMD_BUF
:
426 rd_write_section(rd
, RD_CMDSTREAM_ADDR
,
427 (uint32_t[3]){ iova
, szd
, iova
>> 32 }, 12);