Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8416e677 authored by Jordan Crouse's avatar Jordan Crouse
Browse files

drm/msm: Improved rd_full buffer dumping



Always print the iova and size for every buffer in a commit when
rd_full is enabled but only dump the contents for input buffers.
Also make imported buffers work with vmap so that they can be
safely dumped.

Change-Id: Ic0dedbad6ed5c426dc85a9c089b6c86c95c727cc
Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
parent 8691a541
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -653,7 +653,15 @@ void *msm_gem_vaddr(struct drm_gem_object *obj)
	struct msm_gem_object *msm_obj = to_msm_bo(obj);

	mutex_lock(&msm_obj->lock);
	if (!msm_obj->vaddr) {

	if (msm_obj->vaddr) {
		mutex_unlock(&msm_obj->lock);
		return msm_obj->vaddr;
	}

	if (obj->import_attach) {
		msm_obj->vaddr = dma_buf_vmap(obj->import_attach->dmabuf);
	} else {
		struct page **pages = get_pages(obj);
		if (IS_ERR(pages)) {
			mutex_unlock(&msm_obj->lock);
+15 −15
Original line number Diff line number Diff line
@@ -291,22 +291,29 @@ static void snapshot_buf(struct msm_rd_state *rd,
		uint64_t iova, uint32_t size)
{
	struct msm_gem_object *obj = submit->bos[idx].obj;
	const char *buf;

	buf = msm_gem_vaddr(&obj->base);
	if (IS_ERR(buf))
		return;
	uint64_t offset = 0;

	if (iova) {
		buf += iova - submit->bos[idx].iova;
		offset = iova - submit->bos[idx].iova;
	} else {
		iova = submit->bos[idx].iova;
		size = obj->base.size;
	}

	/* Always write the RD_GPUADDR so we know how big the buffer is */
	rd_write_section(rd, RD_GPUADDR,
			(uint64_t[2]) { iova, size }, 16);
	rd_write_section(rd, RD_BUFFER_CONTENTS, buf, size);

	/* But only dump contents for buffers marked as read and not secure */
	if (submit->bos[idx].flags & MSM_SUBMIT_BO_READ &&
		!(obj->flags & MSM_BO_SECURE)) {
		const char *buf = msm_gem_vaddr(&obj->base);

		if (IS_ERR_OR_NULL(buf))
			return;

		rd_write_section(rd, RD_BUFFER_CONTENTS, buf + offset, size);
	}
}

/* called under struct_mutex */
@@ -333,16 +340,9 @@ void msm_rd_dump_submit(struct msm_gem_submit *submit)
	rd_write_section(rd, RD_CMD, msg, ALIGN(n, 4));

	if (rd_full) {
		for (i = 0; i < submit->nr_bos; i++) {
			/* buffers that are written to probably don't start out
			 * with anything interesting:
			 */
			if (submit->bos[i].flags & MSM_SUBMIT_BO_WRITE)
				continue;

		for (i = 0; i < submit->nr_bos; i++)
			snapshot_buf(rd, submit, i, 0, 0);
	}
	}

	for (i = 0; i < submit->nr_cmds; i++) {
		uint64_t iova = submit->cmd[i].iova;