We need to map the batch buffer before we attempt to dump it. Also, break dumping out into a separate function to make error handling a bit cleaner. --- drivers/gpu/drm/i915/i915_gem_debugfs.c | 63 ++++++++++++++++++++++++------ 1 files changed, 50 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem_debugfs.c b/drivers/gpu/drm/i915/i915_gem_debugfs.c index e8ca71b..1386605 100644 --- a/drivers/gpu/drm/i915/i915_gem_debugfs.c +++ b/drivers/gpu/drm/i915/i915_gem_debugfs.c @@ -9,6 +9,10 @@ #if defined(CONFIG_DEBUG_FS) +static void dump_batch_buffer(struct drm_device *dev, struct seq_file *m, + uint32_t batch_offset, uint32_t mask, uint32_t acthd); + + static int i915_gem_active_info(struct seq_file *m, void *data) { struct drm_minor *minor = (struct drm_minor *) m->private; @@ -683,20 +687,14 @@ static void dump_cmds (struct seq_file *m, /* check for MI_BATCH_BUFFER_START */ if ( (data & batch_start_mask) == batch_start_cmd) { - uint32_t batch = ptr[1] & ~3; + uint32_t batch_offset = 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"); - 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"); - } + + seq_printf(m, "\t%08x: %08x\n", (ring + 4) & mask, batch_offset); + seq_printf(m, "Batch buffer at 0x%08x (%s)\n", batch_offset, addr_type ? "GfxMem" : "PhysMem"); + if (addr_type) + dump_batch_buffer(dev, m, batch_offset, mask, acthd); + ring = (ring + (count - 1) * 4) & mask; } cmd = (cmd + count * 4) & mask; } else @@ -706,6 +704,45 @@ static void dump_cmds (struct seq_file *m, } } +static void dump_batch_buffer(struct drm_device *dev, struct seq_file *m, uint32_t batch_offset, + uint32_t mask, uint32_t acthd) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_i915_gem_object *obj_priv; + uint32_t page_offset = (batch_offset & ~(PAGE_SIZE-1)); + unsigned char *page; + unsigned char *virt; + int ret; + + obj_priv = find_batch_buffer(dev, batch_offset); + if (obj_priv == NULL) { + DRM_INFO("%s: Couldn't find batch buffer %08x\n", __func__, batch_offset); + return; + } + + ret = i915_gem_object_pin(obj_priv->obj, 0); + if (!ret) { + DRM_INFO("%s: Failed to pin batch buffer %08x\n", __func__, batch_offset); + goto err_pin; + } + + page = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping, page_offset); + if (!page) { + DRM_INFO("%s: Failed to map batch buffer %08x\n", __func__, batch_offset); + goto err_map; + } + + virt = (unsigned char*)(page + batch_offset - page_offset); + seq_printf(m, "{\n"); + dump_cmds(m, dev, virt, 0, PAGE_SIZE, mask, acthd); + seq_printf(m, "}\n"); + +err_map: + io_mapping_unmap_atomic(page); +err_pin: + i915_gem_object_unpin(obj_priv->obj); +} + static int valid_chain(struct drm_device *dev, unsigned int ring, unsigned int end) { drm_i915_private_t *dev_priv = dev->dev_private; -- 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