summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorJordan Crouse <jcrouse@codeaurora.org>2017-06-12 09:16:44 -0600
committerJordan Crouse <jcrouse@codeaurora.org>2017-06-12 15:11:50 -0600
commit8416e6772114538b0208e063eb991249296b2ce7 (patch)
treeec69853db38c72ad0ed272d1e2fac708077df9a9 /drivers/gpu
parent8691a541099ab130a9812dd46899de2eee0ae73d (diff)
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: Jordan Crouse <jcrouse@codeaurora.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/msm/msm_gem.c10
-rw-r--r--drivers/gpu/drm/msm/msm_rd.c30
2 files changed, 24 insertions, 16 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index 6bb29c62378d..b7dd84cb23b9 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -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);
diff --git a/drivers/gpu/drm/msm/msm_rd.c b/drivers/gpu/drm/msm/msm_rd.c
index 8b1302f629f0..edf3ff2a7a61 100644
--- a/drivers/gpu/drm/msm/msm_rd.c
+++ b/drivers/gpu/drm/msm/msm_rd.c
@@ -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,15 +340,8 @@ 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++) {