diff --git a/src/intel/tools/aub_read.c b/src/intel/tools/aub_read.c index 02da00dea8f..0c40242c90f 100644 --- a/src/intel/tools/aub_read.c +++ b/src/intel/tools/aub_read.c @@ -50,12 +50,24 @@ #define SUBOPCODE_BMP 0x1e /* Newer version AUB opcode */ -#define OPCODE_NEW_AUB 0x2e -#define SUBOPCODE_REG_POLL 0x02 -#define SUBOPCODE_REG_WRITE 0x03 -#define SUBOPCODE_MEM_POLL 0x05 -#define SUBOPCODE_MEM_WRITE 0x06 -#define SUBOPCODE_VERSION 0x0e +#define OPCODE_NEW_AUB 0x2e +#define SUBOPCODE_VERSION 0x00 +#define SUBOPCODE_REG_CMP 0x01 +#define SUBOPCODE_REG_POLL 0x02 +#define SUBOPCODE_REG_WRITE 0x03 +#define SUBOPCODE_MEM_CMP 0x04 +#define SUBOPCODE_MEM_POLL 0x05 +#define SUBOPCODE_MEM_WRITE 0x06 +#define SUBOPCODE_FRAME_BEGIN 0x07 +#define SUBOPCODE_COMMENT 0x08 +#define SUBOPCODE_TRACE_DELAY 0x09 +#define SUBOPCODE_MEM_DUMP 0x0a +#define SUBOPCODE_MEM_WRITE_DISCONT 0x0b +#define SUBOPCODE_TEST_PHASE_MARKER 0x0c +#define SUBOPCODE_MEM_CONT_REGION 0x0d +#define SUBOPCODE_VERSION_EXT 0x0e +#define SUBOPCODE_PREDICATE 0x0f +#define SUBOPCODE_DUMP_COMPRESS 0x10 static PRINTFLIKE(3, 4) void parse_error(struct aub_read *read, const uint32_t *p, const char *fmt, ...) @@ -257,12 +269,10 @@ handle_memtrace_reg_write(struct aub_read *read, const uint32_t *p) } static void -handle_memtrace_mem_write(struct aub_read *read, const uint32_t *p) +do_write(struct aub_read *read, uint32_t address_space, uint64_t addr, const void *data, uint32_t size) { - const void *data = p + 5; - uint64_t addr = intel_48b_address(*(uint64_t*)&p[1]); - uint32_t size = p[4]; - uint32_t address_space = p[3] >> 28; + if (0) + fprintf(stderr, "*0x%lx = *0x%p (%d)\n", addr, data, size); switch (address_space) { case 0: /* GGTT */ @@ -284,6 +294,38 @@ handle_memtrace_mem_write(struct aub_read *read, const uint32_t *p) } } +static void +handle_memtrace_mem_write(struct aub_read *read, const uint32_t *p) +{ + const void *data = p + 5; + uint64_t addr = intel_48b_address(*(uint64_t*)&p[1]); + uint32_t size = p[4]; + uint32_t address_space = p[3] >> 28; + + do_write(read, address_space, addr, data, size); +} + +static void +handle_memtrace_mem_write_discont(struct aub_read *read, const uint32_t *p) +{ + uint32_t address_space = p[1] >> 28; + const struct { + uint64_t address; + uint32_t size; + } __attribute__((packed)) *cur = (const void *)(p + 2); + const void *data = p + 2 + 3 * 63; + + for (unsigned i = 0; i < 63; ++i, ++cur) { + uint64_t addr = intel_48b_address(cur->address); + uint32_t size = cur->size; + + if (size == 0) + continue; + + do_write(read, address_space, addr, data, size); + } +} + int aub_read_command(struct aub_read *read, const void *data, uint32_t data_len) { @@ -322,6 +364,14 @@ aub_read_command(struct aub_read *read, const void *data, uint32_t data_len) return -1; } + if (0) { + fprintf(stderr, "0x%x, 0x%x, 0x%x, len: %d\n", + TYPE(h), OPCODE(h), SUBOPCODE(h), header_length); + for (const uint32_t *cur = p; cur < next; ++cur) + fprintf(stderr, "0x%08x ", *cur); + fprintf(stderr, "\n"); + } + switch (h & 0xffff0000) { case MAKE_HEADER(TYPE_AUB, OPCODE_AUB, SUBOPCODE_HEADER): if (!handle_trace_header(read, p)) @@ -333,7 +383,7 @@ aub_read_command(struct aub_read *read, const void *data, uint32_t data_len) break; case MAKE_HEADER(TYPE_AUB, OPCODE_AUB, SUBOPCODE_BMP): break; - case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_VERSION): + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_VERSION_EXT): if (!handle_memtrace_version(read, p)) return -1; break; @@ -348,6 +398,23 @@ aub_read_command(struct aub_read *read, const void *data, uint32_t data_len) break; case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_REG_POLL): break; + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_COMMENT): + if (read->comment) + read->comment(read->user_data, (const char *)(p + 2)); + break; + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_WRITE_DISCONT): + handle_memtrace_mem_write_discont(read, p); + break; + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_VERSION): + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_REG_CMP): + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_CMP): + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_FRAME_BEGIN): + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_TRACE_DELAY): + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_DUMP): + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_TEST_PHASE_MARKER): + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_CONT_REGION): + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_PREDICATE): + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_DUMP_COMPRESS): default: parse_error(read, p, "unknown block type=0x%x, opcode=0x%x, subopcode=0x%x (%08x)\n", diff --git a/src/intel/tools/aub_read.h b/src/intel/tools/aub_read.h index 4b815d1f6af..6f2c38db2f8 100644 --- a/src/intel/tools/aub_read.h +++ b/src/intel/tools/aub_read.h @@ -42,6 +42,8 @@ struct aub_read { void (*info)(void *user_data, int pci_id, const char *app_name); + void (*comment)(void *user_data, const char *msg); + void (*local_write)(void *user_data, uint64_t phys_addr, const void *data, uint32_t data_len); void (*phys_write)(void *user_data, uint64_t phys_addr, const void *data, uint32_t data_len); void (*ggtt_write)(void *user_data, uint64_t phys_addr, const void *data, uint32_t data_len); diff --git a/src/intel/tools/aubinator.c b/src/intel/tools/aubinator.c index fb0a9528f77..7baa2e65dfd 100644 --- a/src/intel/tools/aubinator.c +++ b/src/intel/tools/aubinator.c @@ -72,6 +72,12 @@ aubinator_error(void *user_data, const void *aub_data, const char *msg) fprintf(stderr, "%s", msg); } +static void +aubinator_comment(void *user_data, const char *str) +{ + fprintf(outfile, "%s\n", str); +} + static void aubinator_init(void *user_data, int aub_pci_id, const char *app_name) { @@ -373,6 +379,7 @@ int main(int argc, char *argv[]) .user_data = &mem, .error = aubinator_error, .info = aubinator_init, + .comment = aubinator_comment, .local_write = aub_mem_local_write, .phys_write = aub_mem_phys_write,