diff mbox

[40/48] staging: etnaviv: debugfs: add possibility to dump kernel buffer

Message ID 1443182280-15868-41-git-send-email-l.stach@pengutronix.de (mailing list archive)
State New, archived
Headers show

Commit Message

Lucas Stach Sept. 25, 2015, 11:57 a.m. UTC
From: Christian Gmeiner <christian.gmeiner@gmail.com>

This is very useful for debugging issues regarding command
buffer processing.

Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
---
 drivers/staging/etnaviv/etnaviv_drv.c | 39 +++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

Comments

Russell King - ARM Linux Oct. 21, 2015, 11:38 a.m. UTC | #1
On Fri, Sep 25, 2015 at 01:57:52PM +0200, Lucas Stach wrote:
> From: Christian Gmeiner <christian.gmeiner@gmail.com>
> 
> This is very useful for debugging issues regarding command
> buffer processing.
> 
> Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>

Applied, thanks.
diff mbox

Patch

diff --git a/drivers/staging/etnaviv/etnaviv_drv.c b/drivers/staging/etnaviv/etnaviv_drv.c
index 85dbe3813859..d55d2c9f4d0f 100644
--- a/drivers/staging/etnaviv/etnaviv_drv.c
+++ b/drivers/staging/etnaviv/etnaviv_drv.c
@@ -21,6 +21,7 @@ 
 #include "etnaviv_gpu.h"
 #include "etnaviv_gem.h"
 #include "etnaviv_mmu.h"
+#include "etnaviv_gem.h"
 
 #ifdef CONFIG_DRM_ETNAVIV_REGISTER_LOGGING
 static bool reglog;
@@ -234,6 +235,43 @@  static int etnaviv_mmu_show(struct drm_device *dev, struct seq_file *m)
 	return 0;
 }
 
+static void etnaviv_buffer_dump(struct etnaviv_gpu *gpu, struct seq_file *m)
+{
+	struct etnaviv_gem_object *obj = to_etnaviv_bo(gpu->buffer);
+	u32 size = obj->base.size;
+	u32 *ptr = obj->vaddr;
+	u32 i;
+
+	seq_printf(m, "virt %p - phys 0x%llx - free 0x%08x\n",
+			obj->vaddr, (u64)obj->paddr, size - (obj->offset * 4));
+
+	for (i = 0; i < size / 4; i++) {
+		if (i && !(i % 4))
+			seq_puts(m, "\n");
+		if (i % 4 == 0)
+			seq_printf(m, "\t0x%p: ", ptr + i);
+		seq_printf(m, "%08x ", *(ptr + i));
+	}
+	seq_puts(m, "\n");
+}
+
+static int etnaviv_ring_show(struct drm_device *dev, struct seq_file *m)
+{
+	struct etnaviv_drm_private *priv = dev->dev_private;
+	struct etnaviv_gpu *gpu;
+	unsigned int i;
+
+	for (i = 0; i < ETNA_MAX_PIPES; i++) {
+		gpu = priv->gpu[i];
+		if (gpu) {
+			seq_printf(m, "Ring Buffer (%s): ",
+				   dev_name(gpu->dev));
+			etnaviv_buffer_dump(gpu, m);
+		}
+	}
+	return 0;
+}
+
 static int show_locked(struct seq_file *m, void *arg)
 {
 	struct drm_info_node *node = (struct drm_info_node *) m->private;
@@ -282,6 +320,7 @@  static struct drm_info_list etnaviv_debugfs_list[] = {
 		{"gem", show_locked, 0, etnaviv_gem_show},
 		{ "mm", show_locked, 0, etnaviv_mm_show },
 		{"mmu", show_locked, 0, etnaviv_mmu_show},
+		{"ring", show_locked, 0, etnaviv_ring_show},
 };
 
 static int etnaviv_debugfs_init(struct drm_minor *minor)