@@ -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", ®);
+ if (matched == 1) {
+ head[i++] = print_head(reg);
+ }
+
matched = sscanf(line, " ACTHD: 0x%08x\n", ®);
if (matched == 1)
drm_intel_decode_set_head_tail(decode_ctx, reg, 0xffffffff);
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(-)