drm/msm/rd: add module param to dump all bo's
authorRob Clark <robdclark@gmail.com>
Thu, 16 Jun 2016 15:54:41 +0000 (11:54 -0400)
committerRob Clark <robdclark@gmail.com>
Sat, 16 Jul 2016 14:09:10 +0000 (10:09 -0400)
By default, if using $debugfs/.../rd to log cmdstream, only the
cmdstream buffers themselves are logged.  But in some cases we want
to capture other buffers in the submit (to see VBO's or shaders).
So add a mod-param knob to control this.

Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/msm_rd.c

index fa02b5a50f3154fac257d00cc5502b5619d2f23c..24254e07bcd58f6c1ea8c943e2c4f6866de286bf 100644 (file)
  * This bypasses drm_debugfs_create_files() mainly because we need to use
  * our own fops for a bit more control.  In particular, we don't want to
  * do anything if userspace doesn't have the debugfs file open.
+ *
+ * The module-param "rd_full", which defaults to false, enables snapshotting
+ * all (non-written) buffers in the submit, rather than just cmdstream bo's.
+ * This is useful to capture the contents of (for example) vbo's or textures,
+ * or shader programs (if not emitted inline in cmdstream).
  */
 
 #ifdef CONFIG_DEBUG_FS
 #include "msm_gpu.h"
 #include "msm_gem.h"
 
+static bool rd_full = false;
+MODULE_PARM_DESC(rd_full, "If true, $debugfs/.../rd will snapshot all buffer contents");
+module_param_named(rd_full, rd_full, bool, 0600);
+
 enum rd_sect_type {
        RD_NONE,
        RD_TEST,       /* ascii text */
@@ -288,7 +297,12 @@ static void snapshot_buf(struct msm_rd_state *rd,
        if (IS_ERR(buf))
                return;
 
-       buf += iova - submit->bos[idx].iova;
+       if (iova) {
+               buf += iova - submit->bos[idx].iova;
+       } else {
+               iova = submit->bos[idx].iova;
+               size = obj->base.size;
+       }
 
        rd_write_section(rd, RD_GPUADDR,
                        (uint32_t[2]){ iova, size }, 8);
@@ -320,17 +334,27 @@ void msm_rd_dump_submit(struct msm_gem_submit *submit)
 
        rd_write_section(rd, RD_CMD, msg, ALIGN(n, 4));
 
-       /* could be nice to have an option (module-param?) to snapshot
-        * all the bo's associated with the submit.  Handy to see vtx
-        * buffers, etc.  For now just the cmdstream bo's is enough.
-        */
+       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;
+
+                       snapshot_buf(rd, submit, i, 0, 0);
+               }
+       }
 
        for (i = 0; i < submit->nr_cmds; i++) {
                uint32_t iova = submit->cmd[i].iova;
                uint32_t szd  = submit->cmd[i].size; /* in dwords */
 
-               snapshot_buf(rd, submit, submit->cmd[i].idx,
-                               submit->cmd[i].iova, szd * 4);
+               /* snapshot cmdstream bo's (if we haven't already): */
+               if (!rd_full) {
+                       snapshot_buf(rd, submit, submit->cmd[i].idx,
+                                       submit->cmd[i].iova, szd * 4);
+               }
 
                switch (submit->cmd[i].type) {
                case MSM_SUBMIT_CMD_IB_TARGET_BUF: