When dumping a batch buffer, we need to find its gem object so that we
may pin it. Here we look through active_list, inactive_list, and
flushing_list looking for an object with a valid and matching gtt_offset
---
 drivers/gpu/drm/i915/i915_gem_debugfs.c |   47 +++++++++++++++++++++++++------
 1 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_debugfs.c 
b/drivers/gpu/drm/i915/i915_gem_debugfs.c
index 10ca9ae..e8ca71b 100644
--- a/drivers/gpu/drm/i915/i915_gem_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_gem_debugfs.c
@@ -617,7 +617,32 @@ static int dump_cmd(struct seq_file *m, uint32_t cmd, int 
count)
        return ret;
 }
 
-static void dump_cmds (struct seq_file      *m,
+static struct drm_i915_gem_object* find_batch_buffer_in_list(struct list_head 
*head, uint32_t gtt_offset)
+{
+       struct drm_i915_gem_object* obj_priv;
+
+       list_for_each_entry(obj_priv, head, list) {
+               if (obj_priv->gtt_space && gtt_offset == obj_priv->gtt_offset) 
+                       return obj_priv;
+       }
+       return NULL;
+}
+
+static struct drm_i915_gem_object* find_batch_buffer(struct drm_device *dev, 
uint32_t gtt_offset)
+{
+       struct drm_i915_gem_object* obj_priv;
+       drm_i915_private_t *dev_priv = dev->dev_private;
+
+       obj_priv = find_batch_buffer_in_list(&dev_priv->mm.active_list, 
gtt_offset);
+       if (!obj_priv)
+               obj_priv = 
find_batch_buffer_in_list(&dev_priv->mm.inactive_list, gtt_offset);
+       if (!obj_priv)
+               obj_priv = 
find_batch_buffer_in_list(&dev_priv->mm.flushing_list, gtt_offset);
+       return obj_priv;
+}
+
+static void dump_cmds (struct seq_file *m,
+               struct drm_device       *dev,
                volatile unsigned char  *virt,
                uint32_t                start,
                uint32_t                stop,
@@ -646,7 +671,6 @@ static void dump_cmds (struct seq_file      *m,
                if (ring == acthd)
                        seq_printf(m, "****");
 
-               DRM_INFO("\t%08x: %08x", ring, *(volatile unsigned int*) (virt 
+ ring));
                if (ring == cmd) {
                        ptr = (volatile uint32_t *) (virt + ring);
                        data = *ptr;
@@ -661,13 +685,18 @@ static void dump_cmds (struct seq_file      *m,
                        if ( (data & batch_start_mask) == batch_start_cmd) {
                                uint32_t batch = ptr[1] & ~3;
                                uint32_t addr_type = (ptr[0] & (1 << 7));
+                               struct drm_i915_gem_object *obj_priv = 
find_batch_buffer(dev, batch);
+
                                seq_printf(m, "\t%08x: %08x\n", (ring + 4) & 
mask, batch);
-                               seq_printf(m, "Batch buffer at 0x%08x (%s) 
{\n", batch, addr_type ? "GfxMem" : "PhysMem");
-                               /* TODO: Implement batch buffer dumping
-                                  dump_cmds(m, acthd);
-                                  ring = (ring + (count -1)*4) & mask;
-                                */
-                               seq_printf(m, "}\n");
+                               seq_printf(m, "Batch buffer at 0x%08x (%s)\n", 
batch, addr_type ? "GfxMem" : "PhysMem");
+                               if (obj_priv) {
+                                       unsigned char *virt = obj_priv->obj;
+                                       /* TODO: Implement batch buffer dumping 
*/
+                                       seq_printf(m, "{\n");
+                                       dump_cmds(m, dev, (unsigned 
char*)batch, 0, 4096, mask, acthd);
+                                       ring = (ring + (count -1)*4) & mask;
+                                       seq_printf(m, "}\n");
+                               }
                        }
                        cmd = (cmd + count * 4) & mask;
                } else
@@ -730,7 +759,7 @@ static void dump_ring(struct seq_file *m, struct drm_device 
*dev, uint32_t acthd
                        break;
        }
 
-       dump_cmds(m, virt, cmd, head, mask, acthd);
+       dump_cmds(m, dev, virt, cmd, head, mask, acthd);
        seq_printf(m, "Ring end\n");
 }
 
-- 
1.6.0.6


------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to