ntel-gpu-tools/tools/intel_decode_file.c
Chris Wilson 94a180c0c9 decode: Split decoder and reuse outside of intel_gpu_dump
Introduce a second decoder that simpler operates on a file so that it
can be run on dumped batchbuffers independent of the gpu.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2009-11-30 15:55:03 +00:00

147 lines
2.9 KiB
C

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "intel_decode.h"
static void
read_data_text (const char *filename, uint32_t devid, int is_batch)
{
FILE *file;
uint32_t *data = NULL;
int data_size = 0, count = 0, line_number = 0, matched;
char *line = NULL;
size_t line_size;
uint32_t offset, value;
uint32_t gtt_offset = 0, new_gtt_offset;
char *buffer_type = is_batch ? "batchbuffer" : "ringbuffer";
file = fopen (filename, "r");
if (file == NULL) {
fprintf (stderr, "Failed to open %s: %s\n",
filename, strerror (errno));
exit (1);
}
while (getline (&line, &line_size, file) > 0) {
line_number++;
matched = sscanf (line, "--- gtt_offset = 0x%08x\n", &new_gtt_offset);
if (matched == 1) {
if (count) {
printf("%s at 0x%08x:\n", buffer_type, gtt_offset);
intel_decode (data, count, gtt_offset, devid, 0);
count = 0;
}
gtt_offset = new_gtt_offset;
continue;
}
matched = sscanf (line, "%08x : %08x", &offset, &value);
if (matched !=2 ) {
fprintf (stderr, "Warning: Ignoring unrecognized line at %s:%d:\n%s",
filename, line_number, line);
continue;
}
count++;
if (count > data_size) {
data_size = data_size ? data_size * 2 : 1024;
data = realloc (data, data_size * sizeof (uint32_t));
if (data == NULL) {
fprintf (stderr, "Out of memory.\n");
exit (1);
}
}
data[count-1] = value;
}
if (count) {
printf("%s at 0x%08x:\n", buffer_type, gtt_offset);
intel_decode (data, count, gtt_offset, devid, 0);
}
free (data);
free (line);
fclose (file);
}
static int
read_data_file (const char *filename, uint32_t devid, int is_batch)
{
FILE *file;
uint32_t *buf;
uint32_t len = 4096;
int count = 0;
buf = malloc (sizeof (uint32_t) * len);
if (buf == NULL) {
fprintf (stderr, "Failed to allocate memory for %s.\n",
filename);
return 0;
}
file = fopen (filename, "rb");
if (file == NULL) {
free (buf);
fprintf (stderr, "Failed to open %s: %s\n",
filename, strerror (errno));
return 0;
}
do {
uint32_t *newbuf;
count += fread (buf + count, sizeof (uint32_t), len - count, file);
if (count < len)
break;
len *= 2;
newbuf = realloc (buf, len * sizeof (uint32_t));
if (newbuf == NULL) {
free (buf);
fclose (file);
fprintf (stderr, "Failed to allocate memory for %s.\n",
filename);
return 0;
}
buf = newbuf;
} while (1);
fclose (file);
intel_decode (buf, count, 0x0, devid, 1);
intel_decode_context_reset ();
free (buf);
return 1;
}
int
main (int argc, char **argv)
{
int is_text = 0;
int i;
uint32_t devid =0x27A2;
for (i = 1; i < argc; i++) {
if (strncmp (argv[i], "--pci-id=", 9) == 0) {
devid = atoi (argv[i] + 9);
continue;
}
if (is_text)
read_data_text (argv[i], devid, 1);
else
read_data_file (argv[i], devid, 1);
}
return 0;
}