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.
27 * This bypasses drm_debugfs_create_files() mainly because we need to use
28 * our own fops for a bit more control. In particular, we don't want to
29 * do anything if userspace doesn't have the debugfs file open.
31 * The module-param "rd_full", which defaults to false, enables snapshotting
32 * all (non-written) buffers in the submit, rather than just cmdstream bo's.
33 * This is useful to capture the contents of (for example) vbo's or textures,
34 * or shader programs (if not emitted inline in cmdstream).
37 #ifdef CONFIG_DEBUG_FS
39 #include <linux/kfifo.h>
40 #include <linux/debugfs.h>
41 #include <linux/circ_buf.h>
42 #include <linux/wait.h>
48 static bool rd_full
= false;
49 MODULE_PARM_DESC(rd_full
, "If true, $debugfs/.../rd will snapshot all buffer contents");
50 module_param_named(rd_full
, rd_full
, bool, 0600);
54 RD_TEST
, /* ascii text */
55 RD_CMD
, /* ascii text */
56 RD_GPUADDR
, /* u32 gpuaddr, u32 size */
57 RD_CONTEXT
, /* raw dump */
58 RD_CMDSTREAM
, /* raw dump */
59 RD_CMDSTREAM_ADDR
, /* gpu addr of cmdstream */
60 RD_PARAM
, /* u32 param_type, u32 param_val, u32 bitlen */
61 RD_FLUSH
, /* empty, clear previous params */
62 RD_PROGRAM
, /* shader program, raw dump */
69 #define BUF_SZ 512 /* should be power of 2 */
72 #define circ_count(circ) \
73 (CIRC_CNT((circ)->head, (circ)->tail, BUF_SZ))
74 #define circ_count_to_end(circ) \
75 (CIRC_CNT_TO_END((circ)->head, (circ)->tail, BUF_SZ))
76 /* space available: */
77 #define circ_space(circ) \
78 (CIRC_SPACE((circ)->head, (circ)->tail, BUF_SZ))
79 #define circ_space_to_end(circ) \
80 (CIRC_SPACE_TO_END((circ)->head, (circ)->tail, BUF_SZ))
83 struct drm_device
*dev
;
88 struct drm_info_node
*node
;
90 /* current submit to read out: */
91 struct msm_gem_submit
*submit
;
93 /* fifo access is synchronized on the producer side by
94 * struct_mutex held by submit code (otherwise we could
95 * end up w/ cmds logged in different order than they
96 * were executed). And read_lock synchronizes the reads
98 struct mutex read_lock
;
100 wait_queue_head_t fifo_event
;
101 struct circ_buf fifo
;
106 static void rd_write(struct msm_rd_state
*rd
, const void *buf
, int sz
)
108 struct circ_buf
*fifo
= &rd
->fifo
;
109 const char *ptr
= buf
;
112 char *fptr
= &fifo
->buf
[fifo
->head
];
115 wait_event(rd
->fifo_event
, circ_space(&rd
->fifo
) > 0);
117 n
= min(sz
, circ_space_to_end(&rd
->fifo
));
118 memcpy(fptr
, ptr
, n
);
120 fifo
->head
= (fifo
->head
+ n
) & (BUF_SZ
- 1);
124 wake_up_all(&rd
->fifo_event
);
128 static void rd_write_section(struct msm_rd_state
*rd
,
129 enum rd_sect_type type
, const void *buf
, int sz
)
131 rd_write(rd
, &type
, 4);
132 rd_write(rd
, &sz
, 4);
133 rd_write(rd
, buf
, sz
);
136 static ssize_t
rd_read(struct file
*file
, char __user
*buf
,
137 size_t sz
, loff_t
*ppos
)
139 struct msm_rd_state
*rd
= file
->private_data
;
140 struct circ_buf
*fifo
= &rd
->fifo
;
141 const char *fptr
= &fifo
->buf
[fifo
->tail
];
144 mutex_lock(&rd
->read_lock
);
146 ret
= wait_event_interruptible(rd
->fifo_event
,
147 circ_count(&rd
->fifo
) > 0);
151 n
= min_t(int, sz
, circ_count_to_end(&rd
->fifo
));
152 if (copy_to_user(buf
, fptr
, n
)) {
157 fifo
->tail
= (fifo
->tail
+ n
) & (BUF_SZ
- 1);
160 wake_up_all(&rd
->fifo_event
);
163 mutex_unlock(&rd
->read_lock
);
169 static int rd_open(struct inode
*inode
, struct file
*file
)
171 struct msm_rd_state
*rd
= inode
->i_private
;
172 struct drm_device
*dev
= rd
->dev
;
173 struct msm_drm_private
*priv
= dev
->dev_private
;
174 struct msm_gpu
*gpu
= priv
->gpu
;
179 mutex_lock(&dev
->struct_mutex
);
181 if (rd
->open
|| !gpu
) {
186 file
->private_data
= rd
;
189 /* the parsing tools need to know gpu-id to know which
190 * register database to load.
192 gpu
->funcs
->get_param(gpu
, MSM_PARAM_GPU_ID
, &val
);
195 rd_write_section(rd
, RD_GPU_ID
, &gpu_id
, sizeof(gpu_id
));
198 mutex_unlock(&dev
->struct_mutex
);
202 static int rd_release(struct inode
*inode
, struct file
*file
)
204 struct msm_rd_state
*rd
= inode
->i_private
;
210 static const struct file_operations rd_debugfs_fops
= {
211 .owner
= THIS_MODULE
,
215 .release
= rd_release
,
218 int msm_rd_debugfs_init(struct drm_minor
*minor
)
220 struct msm_drm_private
*priv
= minor
->dev
->dev_private
;
221 struct msm_rd_state
*rd
;
223 /* only create on first minor: */
227 rd
= kzalloc(sizeof(*rd
), GFP_KERNEL
);
231 rd
->dev
= minor
->dev
;
232 rd
->fifo
.buf
= rd
->buf
;
234 mutex_init(&rd
->read_lock
);
237 init_waitqueue_head(&rd
->fifo_event
);
239 rd
->node
= kzalloc(sizeof(*rd
->node
), GFP_KERNEL
);
243 rd
->ent
= debugfs_create_file("rd", S_IFREG
| S_IRUGO
,
244 minor
->debugfs_root
, rd
, &rd_debugfs_fops
);
246 DRM_ERROR("Cannot create /sys/kernel/debug/dri/%pd/rd\n",
247 minor
->debugfs_root
);
251 rd
->node
->minor
= minor
;
252 rd
->node
->dent
= rd
->ent
;
253 rd
->node
->info_ent
= NULL
;
255 mutex_lock(&minor
->debugfs_lock
);
256 list_add(&rd
->node
->list
, &minor
->debugfs_list
);
257 mutex_unlock(&minor
->debugfs_lock
);
262 msm_rd_debugfs_cleanup(minor
);
266 void msm_rd_debugfs_cleanup(struct drm_minor
*minor
)
268 struct msm_drm_private
*priv
= minor
->dev
->dev_private
;
269 struct msm_rd_state
*rd
= priv
->rd
;
276 debugfs_remove(rd
->ent
);
279 mutex_lock(&minor
->debugfs_lock
);
280 list_del(&rd
->node
->list
);
281 mutex_unlock(&minor
->debugfs_lock
);
285 mutex_destroy(&rd
->read_lock
);
290 static void snapshot_buf(struct msm_rd_state
*rd
,
291 struct msm_gem_submit
*submit
, int idx
,
292 uint32_t iova
, uint32_t size
)
294 struct msm_gem_object
*obj
= submit
->bos
[idx
].obj
;
297 buf
= msm_gem_get_vaddr_locked(&obj
->base
);
302 buf
+= iova
- submit
->bos
[idx
].iova
;
304 iova
= submit
->bos
[idx
].iova
;
305 size
= obj
->base
.size
;
308 rd_write_section(rd
, RD_GPUADDR
,
309 (uint32_t[2]){ iova
, size
}, 8);
310 rd_write_section(rd
, RD_BUFFER_CONTENTS
, buf
, size
);
312 msm_gem_put_vaddr_locked(&obj
->base
);
315 /* called under struct_mutex */
316 void msm_rd_dump_submit(struct msm_gem_submit
*submit
)
318 struct drm_device
*dev
= submit
->dev
;
319 struct msm_drm_private
*priv
= dev
->dev_private
;
320 struct msm_rd_state
*rd
= priv
->rd
;
327 /* writing into fifo is serialized by caller, and
328 * rd->read_lock is used to serialize the reads
330 WARN_ON(!mutex_is_locked(&dev
->struct_mutex
));
332 n
= snprintf(msg
, sizeof(msg
), "%.*s/%d: fence=%u",
333 TASK_COMM_LEN
, current
->comm
, task_pid_nr(current
),
334 submit
->fence
->seqno
);
336 rd_write_section(rd
, RD_CMD
, msg
, ALIGN(n
, 4));
339 for (i
= 0; i
< submit
->nr_bos
; i
++) {
340 /* buffers that are written to probably don't start out
341 * with anything interesting:
343 if (submit
->bos
[i
].flags
& MSM_SUBMIT_BO_WRITE
)
346 snapshot_buf(rd
, submit
, i
, 0, 0);
350 for (i
= 0; i
< submit
->nr_cmds
; i
++) {
351 uint32_t iova
= submit
->cmd
[i
].iova
;
352 uint32_t szd
= submit
->cmd
[i
].size
; /* in dwords */
354 /* snapshot cmdstream bo's (if we haven't already): */
356 snapshot_buf(rd
, submit
, submit
->cmd
[i
].idx
,
357 submit
->cmd
[i
].iova
, szd
* 4);
360 switch (submit
->cmd
[i
].type
) {
361 case MSM_SUBMIT_CMD_IB_TARGET_BUF
:
362 /* ignore IB-targets, we've logged the buffer, the
363 * parser tool will follow the IB based on the logged
364 * buffer/gpuaddr, so nothing more to do.
367 case MSM_SUBMIT_CMD_CTX_RESTORE_BUF
:
368 case MSM_SUBMIT_CMD_BUF
:
369 rd_write_section(rd
, RD_CMDSTREAM_ADDR
,
370 (uint32_t[2]){ iova
, szd
}, 8);