Mesa (main): intel/tools/aubinator: add support for 2 "new" subopcodes

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue May 24 08:31:58 UTC 2022


Module: Mesa
Branch: main
Commit: 0aac3b1009df6b3068c1203624c32de97aafc746
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0aac3b1009df6b3068c1203624c32de97aafc746

Author: Marcin Ślusarz <marcin.slusarz at intel.com>
Date:   Thu May 19 17:06:48 2022 +0200

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 at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16664>

---

 src/intel/tools/aub_read.c  | 91 +++++++++++++++++++++++++++++++++++++++------
 src/intel/tools/aub_read.h  |  2 +
 src/intel/tools/aubinator.c |  7 ++++
 3 files changed, 88 insertions(+), 12 deletions(-)

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,



More information about the mesa-commit mailing list