diff mbox

[2/4] intel_error_decode: HEAD stuff

Message ID 1366657257-5017-2-git-send-email-ben@bwidawsk.net (mailing list archive)
State New, archived
Headers show

Commit Message

Ben Widawsky April 22, 2013, 7 p.m. UTC
Show the decoded HEAD value, as well as print the calculated head offset
per ringbuffer.

This will be superceded in the next commit, but I think more info is
better.

Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
---
 tools/intel_error_decode.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

Comments

Chris Wilson April 22, 2013, 7:12 p.m. UTC | #1
On Mon, Apr 22, 2013 at 12:00:55PM -0700, Ben Widawsky wrote:
> Show the decoded HEAD value, as well as print the calculated head offset
> per ringbuffer.

Give us an example!
-Chris
diff mbox

Patch

diff --git a/tools/intel_error_decode.c b/tools/intel_error_decode.c
index f554d57..e29ee1e 100644
--- a/tools/intel_error_decode.c
+++ b/tools/intel_error_decode.c
@@ -55,6 +55,13 @@ 
 #include "intel_gpu_tools.h"
 #include "instdone.h"
 
+static uint32_t
+print_head(unsigned int reg)
+{
+	printf("    head = 0x%08x, wraps = %d\n", reg & (0x7ffff<<2), reg >> 21);
+	return reg & (0x7ffff<<2);
+}
+
 static void
 print_instdone(uint32_t devid, unsigned int instdone, unsigned int instdone1)
 {
@@ -288,6 +295,8 @@  read_data_file(FILE *file)
 	const char *buffer_type[2] = {  "ringbuffer", "batchbuffer" };
 	char *ring_name = NULL;
 	int is_batch = 1;
+	uint32_t head[3] = {-1, -1, -1};
+	int i = 0, num_rings = -1;
 
 	while (getline(&line, &line_size, file) > 0) {
 		char *dashes;
@@ -299,6 +308,9 @@  read_data_file(FILE *file)
 			strncpy(new_ring_name, line, dashes - line);
 			new_ring_name[dashes - line - 1] = '\0';
 
+			if (num_rings == -1)
+				num_rings = i;
+
 			matched = sscanf(dashes, "--- gtt_offset = 0x%08x\n",
 					&new_gtt_offset);
 			if (matched == 1) {
@@ -324,10 +336,11 @@  read_data_file(FILE *file)
 					&new_gtt_offset);
 			if (matched == 1) {
 				if (count) {
-					printf("%s (%s) at 0x%08x:\n",
+					printf("%s (%s) at 0x%08x; HEAD points to 0x%08x:\n",
 							buffer_type[is_batch],
 							ring_name,
-							gtt_offset);
+							gtt_offset,
+							head[i++ % num_rings] + gtt_offset);
 					drm_intel_decode_set_batch_pointer(decode_ctx,
 							data, gtt_offset,
 							count);
@@ -377,6 +390,11 @@  read_data_file(FILE *file)
 				decode_ctx = drm_intel_decode_context_alloc(devid);
 			}
 
+			matched = sscanf(line, "  HEAD: 0x%08x\n", &reg);
+			if (matched == 1) {
+				head[i++] = print_head(reg);
+			}
+
 			matched = sscanf(line, "  ACTHD: 0x%08x\n", &reg);
 			if (matched == 1)
 				drm_intel_decode_set_head_tail(decode_ctx, reg, 0xffffffff);