Lines Matching +full:fifo +full:- +full:size

1 // SPDX-License-Identifier: GPL-2.0-only
9 * tail -f /sys/kernel/debug/dri/<minor>/rd > logfile.rd
18 * tail -f /sys/kernel/debug/dri/<minor>/hangrd > logfile.rd
26 * The module-param "rd_full", which defaults to false, enables snapshotting
27 * all (non-written) buffers in the submit, rather than just cmdstream bo's.
54 RD_GPUADDR, /* u32 gpuaddr, u32 size */
72 (CIRC_CNT((circ)->head, (circ)->tail, BUF_SZ))
74 (CIRC_CNT_TO_END((circ)->head, (circ)->tail, BUF_SZ))
77 (CIRC_SPACE((circ)->head, (circ)->tail, BUF_SZ))
79 (CIRC_SPACE_TO_END((circ)->head, (circ)->tail, BUF_SZ))
86 /* fifo access is synchronized on the producer side by
92 struct circ_buf fifo; member
99 struct circ_buf *fifo = &rd->fifo; in rd_write() local
103 char *fptr = &fifo->buf[fifo->head]; in rd_write()
106 wait_event(rd->fifo_event, circ_space(&rd->fifo) > 0 || !rd->open); in rd_write()
107 if (!rd->open) in rd_write()
114 n = min(sz, circ_space_to_end(&rd->fifo)); in rd_write()
117 smp_store_release(&fifo->head, (fifo->head + n) & (BUF_SZ - 1)); in rd_write()
118 sz -= n; in rd_write()
121 wake_up_all(&rd->fifo_event); in rd_write()
136 struct msm_rd_state *rd = file->private_data; in rd_read()
137 struct circ_buf *fifo = &rd->fifo; in rd_read() local
138 const char *fptr = &fifo->buf[fifo->tail]; in rd_read()
141 mutex_lock(&rd->read_lock); in rd_read()
143 ret = wait_event_interruptible(rd->fifo_event, in rd_read()
144 circ_count(&rd->fifo) > 0); in rd_read()
152 n = min_t(int, sz, circ_count_to_end(&rd->fifo)); in rd_read()
154 ret = -EFAULT; in rd_read()
158 smp_store_release(&fifo->tail, (fifo->tail + n) & (BUF_SZ - 1)); in rd_read()
161 wake_up_all(&rd->fifo_event); in rd_read()
164 mutex_unlock(&rd->read_lock); in rd_read()
172 struct msm_rd_state *rd = inode->i_private; in rd_open()
173 struct drm_device *dev = rd->dev; in rd_open()
174 struct msm_drm_private *priv = dev->dev_private; in rd_open()
175 struct msm_gpu *gpu = priv->gpu; in rd_open()
182 return -ENODEV; in rd_open()
184 mutex_lock(&gpu->lock); in rd_open()
186 if (rd->open) { in rd_open()
187 ret = -EBUSY; in rd_open()
191 file->private_data = rd; in rd_open()
192 rd->open = true; in rd_open()
194 /* Reset fifo to clear any previously unread data: */ in rd_open()
195 rd->fifo.head = rd->fifo.tail = 0; in rd_open()
197 /* the parsing tools need to know gpu-id to know which in rd_open()
202 gpu->funcs->get_param(gpu, NULL, MSM_PARAM_GPU_ID, &val, &zero); in rd_open()
207 gpu->funcs->get_param(gpu, NULL, MSM_PARAM_CHIP_ID, &val, &zero); in rd_open()
211 mutex_unlock(&gpu->lock); in rd_open()
217 struct msm_rd_state *rd = inode->i_private; in rd_release()
219 rd->open = false; in rd_release()
220 wake_up_all(&rd->fifo_event); in rd_release()
240 mutex_destroy(&rd->read_lock); in rd_cleanup()
241 mutex_destroy(&rd->write_lock); in rd_cleanup()
251 return ERR_PTR(-ENOMEM); in rd_init()
253 rd->dev = minor->dev; in rd_init()
254 rd->fifo.buf = rd->buf; in rd_init()
256 mutex_init(&rd->read_lock); in rd_init()
257 mutex_init(&rd->write_lock); in rd_init()
259 init_waitqueue_head(&rd->fifo_event); in rd_init()
261 debugfs_create_file(name, S_IFREG | S_IRUGO, minor->debugfs_root, rd, in rd_init()
269 struct msm_drm_private *priv = minor->dev->dev_private; in msm_rd_debugfs_init()
273 if (!priv->gpu_pdev) in msm_rd_debugfs_init()
277 if (priv->rd) in msm_rd_debugfs_init()
286 priv->rd = rd; in msm_rd_debugfs_init()
294 priv->hangrd = rd; in msm_rd_debugfs_init()
305 rd_cleanup(priv->rd); in msm_rd_debugfs_cleanup()
306 priv->rd = NULL; in msm_rd_debugfs_cleanup()
308 rd_cleanup(priv->hangrd); in msm_rd_debugfs_cleanup()
309 priv->hangrd = NULL; in msm_rd_debugfs_cleanup()
314 uint64_t iova, uint32_t size, bool full) in snapshot_buf() argument
316 struct drm_gem_object *obj = submit->bos[idx].obj; in snapshot_buf()
321 offset = iova - submit->bos[idx].iova; in snapshot_buf()
323 iova = submit->bos[idx].iova; in snapshot_buf()
324 size = obj->size; in snapshot_buf()
332 (uint32_t[3]){ iova, size, iova >> 32 }, 12); in snapshot_buf()
338 if (!(submit->bos[idx].flags & MSM_SUBMIT_BO_READ)) in snapshot_buf()
347 rd_write_section(rd, RD_BUFFER_CONTENTS, buf, size); in snapshot_buf()
352 /* called under gpu->lock */
360 if (!rd->open) in msm_rd_dump_submit()
363 mutex_lock(&rd->write_lock); in msm_rd_dump_submit()
376 task = pid_task(submit->pid, PIDTYPE_PID); in msm_rd_dump_submit()
379 TASK_COMM_LEN, task->comm, in msm_rd_dump_submit()
380 pid_nr(submit->pid), submit->seqno); in msm_rd_dump_submit()
383 pid_nr(submit->pid), submit->seqno); in msm_rd_dump_submit()
389 for (i = 0; i < submit->nr_bos; i++) in msm_rd_dump_submit()
392 for (i = 0; i < submit->nr_cmds; i++) { in msm_rd_dump_submit()
393 uint32_t szd = submit->cmd[i].size; /* in dwords */ in msm_rd_dump_submit()
397 snapshot_buf(rd, submit, submit->cmd[i].idx, in msm_rd_dump_submit()
398 submit->cmd[i].iova, szd * 4, true); in msm_rd_dump_submit()
402 for (i = 0; i < submit->nr_cmds; i++) { in msm_rd_dump_submit()
403 uint64_t iova = submit->cmd[i].iova; in msm_rd_dump_submit()
404 uint32_t szd = submit->cmd[i].size; /* in dwords */ in msm_rd_dump_submit()
406 switch (submit->cmd[i].type) { in msm_rd_dump_submit()
408 /* ignore IB-targets, we've logged the buffer, the in msm_rd_dump_submit()
421 mutex_unlock(&rd->write_lock); in msm_rd_dump_submit()