intel/tools/aubinator: add support for 2 "new" subopcodes

... and add macros for subopcodes we haven't seen yet

Acked-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16664>
This commit is contained in:
Marcin Ślusarz 2022-05-19 17:06:48 +02:00 committed by Marge Bot
parent 43ad5fd9b7
commit 0aac3b1009
3 changed files with 88 additions and 12 deletions

View File

@ -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",

View File

@ -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);

View File

@ -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,