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()
239 mutex_destroy(&rd->read_lock); in rd_cleanup()
240 mutex_destroy(&rd->write_lock); in rd_cleanup()
250 return ERR_PTR(-ENOMEM); in rd_init()
252 rd->dev = minor->dev; in rd_init()
253 rd->fifo.buf = rd->buf; in rd_init()
255 mutex_init(&rd->read_lock); in rd_init()
256 mutex_init(&rd->write_lock); in rd_init()
258 init_waitqueue_head(&rd->fifo_event); in rd_init()
260 debugfs_create_file(name, S_IFREG | S_IRUGO, minor->debugfs_root, rd, in rd_init()
268 struct msm_drm_private *priv = minor->dev->dev_private; in msm_rd_debugfs_init()
272 if (!priv->gpu_pdev) in msm_rd_debugfs_init()
276 if (priv->rd) in msm_rd_debugfs_init()
285 priv->rd = rd; in msm_rd_debugfs_init()
293 priv->hangrd = rd; in msm_rd_debugfs_init()
304 rd_cleanup(priv->rd); in msm_rd_debugfs_cleanup()
305 priv->rd = NULL; in msm_rd_debugfs_cleanup()
307 rd_cleanup(priv->hangrd); in msm_rd_debugfs_cleanup()
308 priv->hangrd = NULL; in msm_rd_debugfs_cleanup()
313 uint64_t iova, uint32_t size, bool full) in snapshot_buf() argument
315 struct drm_gem_object *obj = submit->bos[idx].obj; in snapshot_buf()
320 offset = iova - submit->bos[idx].iova; in snapshot_buf()
322 iova = submit->bos[idx].iova; in snapshot_buf()
323 size = obj->size; in snapshot_buf()
331 (uint32_t[3]){ iova, size, iova >> 32 }, 12); in snapshot_buf()
337 if (!(submit->bos[idx].flags & MSM_SUBMIT_BO_READ)) in snapshot_buf()
346 rd_write_section(rd, RD_BUFFER_CONTENTS, buf, size); in snapshot_buf()
351 /* called under gpu->lock */
359 if (!rd->open) in msm_rd_dump_submit()
362 mutex_lock(&rd->write_lock); in msm_rd_dump_submit()
375 task = pid_task(submit->pid, PIDTYPE_PID); in msm_rd_dump_submit()
378 TASK_COMM_LEN, task->comm, in msm_rd_dump_submit()
379 pid_nr(submit->pid), submit->seqno); in msm_rd_dump_submit()
382 pid_nr(submit->pid), submit->seqno); in msm_rd_dump_submit()
388 for (i = 0; i < submit->nr_bos; i++) in msm_rd_dump_submit()
391 for (i = 0; i < submit->nr_cmds; i++) { in msm_rd_dump_submit()
392 uint32_t szd = submit->cmd[i].size; /* in dwords */ in msm_rd_dump_submit()
396 snapshot_buf(rd, submit, submit->cmd[i].idx, in msm_rd_dump_submit()
397 submit->cmd[i].iova, szd * 4, true); in msm_rd_dump_submit()
401 for (i = 0; i < submit->nr_cmds; i++) { in msm_rd_dump_submit()
402 uint64_t iova = submit->cmd[i].iova; in msm_rd_dump_submit()
403 uint32_t szd = submit->cmd[i].size; /* in dwords */ in msm_rd_dump_submit()
405 switch (submit->cmd[i].type) { in msm_rd_dump_submit()
407 /* ignore IB-targets, we've logged the buffer, the in msm_rd_dump_submit()
420 mutex_unlock(&rd->write_lock); in msm_rd_dump_submit()