Looks like no functional change, and it's needed by the ui tool, so Reviewed-by: Rafael Antognolli <rafael.antogno...@intel.com>
On Thu, Aug 02, 2018 at 10:39:19AM +0100, Lionel Landwerlin wrote: > Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> > --- > src/intel/tools/aub_read.c | 307 ++++++++++++++++++++++++++++++++++ > src/intel/tools/aub_read.h | 75 +++++++++ > src/intel/tools/aubinator.c | 324 +++++------------------------------- > src/intel/tools/meson.build | 2 +- > 4 files changed, 426 insertions(+), 282 deletions(-) > create mode 100644 src/intel/tools/aub_read.c > create mode 100644 src/intel/tools/aub_read.h > > diff --git a/src/intel/tools/aub_read.c b/src/intel/tools/aub_read.c > new file mode 100644 > index 00000000000..e4578c687ff > --- /dev/null > +++ b/src/intel/tools/aub_read.c > @@ -0,0 +1,307 @@ > +/* > + * Copyright © 2016-2018 Intel Corporation > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the next > + * paragraph) shall be included in all copies or substantial portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER > DEALINGS > + * IN THE SOFTWARE. > + * > + */ > + > +#include <stdio.h> > +#include <stdlib.h> > +#include <string.h> > + > +#include "common/gen_gem.h" > +#include "util/macros.h" > + > +#include "aub_read.h" > +#include "intel_aub.h" > + > +#define TYPE(dw) (((dw) >> 29) & 7) > +#define OPCODE(dw) (((dw) >> 23) & 0x3f) > +#define SUBOPCODE(dw) (((dw) >> 16) & 0x7f) > + > +#define MAKE_HEADER(type, opcode, subopcode) \ > + (((type) << 29) | ((opcode) << 23) | ((subopcode) << 16)) > + > +#define TYPE_AUB 0x7 > + > +/* Classic AUB opcodes */ > +#define OPCODE_AUB 0x01 > +#define SUBOPCODE_HEADER 0x05 > +#define SUBOPCODE_BLOCK 0x41 > +#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 MAKE_GEN(major, minor) (((major) << 8) | (minor)) > + > +static void > +handle_trace_header(struct aub_read *read, const uint32_t *p) > +{ > + /* The intel_aubdump tool from IGT is kind enough to put a PCI-ID= tag in > + * the AUB header comment. If the user hasn't specified a hardware > + * generation, try to use the one from the AUB file. > + */ > + const uint32_t *end = p + (p[0] & 0xffff) + 2; > + int aub_pci_id = 0; > + > + if (end > &p[12] && p[12] > 0) { > + if (sscanf((char *)&p[13], "PCI-ID=%i", &aub_pci_id) > 0) { > + if (!gen_get_device_info(aub_pci_id, &read->devinfo)) { > + fprintf(stderr, "can't find device information: pci_id=0x%x\n", > aub_pci_id); > + exit(EXIT_FAILURE); > + } > + } > + } > + > + char app_name[33]; > + strncpy(app_name, (const char *)&p[2], 32); > + app_name[32] = 0; > + > + if (read->info) > + read->info(read->user_data, aub_pci_id, app_name); > +} > + > +static void > +handle_memtrace_version(struct aub_read *read, const uint32_t *p) > +{ > + int header_length = p[0] & 0xffff; > + char app_name[64]; > + int app_name_len = MIN2(4 * (header_length + 1 - 5), ARRAY_SIZE(app_name) > - 1); > + int pci_id_len = 0; > + int aub_pci_id = 0; > + > + strncpy(app_name, (const char *)&p[5], app_name_len); > + app_name[app_name_len] = 0; > + > + if (sscanf(app_name, "PCI-ID=%i %n", &aub_pci_id, &pci_id_len) > 0) { > + if (!gen_get_device_info(aub_pci_id, &read->devinfo)) { > + fprintf(stderr, "can't find device information: pci_id=0x%x\n", > aub_pci_id); > + exit(EXIT_FAILURE); > + } > + > + if (read->info) > + read->info(read->user_data, aub_pci_id, app_name + pci_id_len); > + } > +} > + > +static void > +handle_trace_block(struct aub_read *read, const uint32_t *p) > +{ > + int operation = p[1] & AUB_TRACE_OPERATION_MASK; > + int type = p[1] & AUB_TRACE_TYPE_MASK; > + int address_space = p[1] & AUB_TRACE_ADDRESS_SPACE_MASK; > + int header_length = p[0] & 0xffff; > + int engine = GEN_ENGINE_RENDER; > + const void *data = p + header_length + 2; > + uint64_t address = gen_48b_address((read->devinfo.gen >= 8 ? ((uint64_t) > p[5] << 32) : 0) | > + ((uint64_t) p[3])); > + uint32_t size = p[4]; > + > + switch (operation) { > + case AUB_TRACE_OP_DATA_WRITE: > + if (address_space == AUB_TRACE_MEMTYPE_GTT) { > + if (read->local_write) > + read->local_write(read->user_data, address, data, size); > + break; > + case AUB_TRACE_OP_COMMAND_WRITE: > + switch (type) { > + case AUB_TRACE_TYPE_RING_PRB0: > + engine = GEN_ENGINE_RENDER; > + break; > + case AUB_TRACE_TYPE_RING_PRB2: > + engine = GEN_ENGINE_BLITTER; > + break; > + default: > + /* fprintf(outfile, "command write to unknown ring %d\n", type); */ > + break; > + } > + > + if (read->ring_write) > + read->ring_write(read->user_data, engine, data, size); > + break; > + } > + } > +} > + > +static void > +handle_memtrace_reg_write(struct aub_read *read, const uint32_t *p) > +{ > + uint32_t offset = p[1]; > + uint32_t value = p[5]; > + > + if (read->reg_write) > + read->reg_write(read->user_data, offset, value); > + > + int engine; > + uint64_t context_descriptor; > + > + switch (offset) { > + case 0x2230: /* render elsp */ > + read->render_elsp[read->render_elsp_index++] = value; > + if (read->render_elsp_index < 4) > + return; > + > + read->render_elsp_index = 0; > + engine = GEN_ENGINE_RENDER; > + context_descriptor = (uint64_t)read->render_elsp[2] << 32 | > + read->render_elsp[3]; > + break; > + case 0x22230: /* blitter elsp */ > + read->blitter_elsp[read->blitter_elsp_index++] = value; > + if (read->blitter_elsp_index < 4) > + return; > + > + read->blitter_elsp_index = 0; > + engine = GEN_ENGINE_BLITTER; > + context_descriptor = (uint64_t)read->blitter_elsp[2] << 32 | > + read->blitter_elsp[3]; > + break; > + case 0x2510: /* render elsq0 lo */ > + read->render_elsp[3] = value; > + return; > + break; > + case 0x2514: /* render elsq0 hi */ > + read->render_elsp[2] = value; > + return; > + break; > + case 0x22510: /* blitter elsq0 lo */ > + read->blitter_elsp[3] = value; > + return; > + break; > + case 0x22514: /* blitter elsq0 hi */ > + read->blitter_elsp[2] = value; > + return; > + break; > + case 0x2550: /* render elsc */ > + engine = GEN_ENGINE_RENDER; > + context_descriptor = (uint64_t)read->render_elsp[2] << 32 | > + read->render_elsp[3]; > + break; > + case 0x22550: /* blitter elsc */ > + engine = GEN_ENGINE_BLITTER; > + context_descriptor = (uint64_t)read->blitter_elsp[2] << 32 | > + read->blitter_elsp[3]; > + break; > + default: > + return; > + } > + > + if (read->execlist_write) > + read->execlist_write(read->user_data, engine, context_descriptor); > +} > + > +static void > +handle_memtrace_mem_write(struct aub_read *read, const uint32_t *p) > +{ > + const void *data = p + 5; > + uint64_t addr = gen_48b_address(*(uint64_t*)&p[1]); > + uint32_t size = p[4]; > + uint32_t address_space = p[3] >> 28; > + > + switch (address_space) { > + case 0: /* GGTT */ > + if (read->ggtt_write) > + read->ggtt_write(read->user_data, addr, data, size); > + break; > + case 1: /* Local */ > + if (read->local_write) > + read->local_write(read->user_data, addr, data, size); > + break; > + case 2: /* Physical */ > + if (read->phys_write) > + read->phys_write(read->user_data, addr, data, size); > + break; > + case 4: /* GGTT Entry */ > + if (read->ggtt_entry_write) > + read->ggtt_entry_write(read->user_data, addr, data, size); > + break; > + } > +} > + > +int > +aub_read_command(struct aub_read *read, const void *data, uint32_t data_len) > +{ > + const uint32_t *p = data, *end = data + data_len, *next; > + uint32_t h, header_length, bias; > + > + assert(data_len >= 4); > + > + h = *p; > + header_length = h & 0xffff; > + > + switch (OPCODE(h)) { > + case OPCODE_AUB: > + bias = 2; > + break; > + case OPCODE_NEW_AUB: > + bias = 1; > + break; > + default: > + /* fprintf(outfile, "unknown opcode %d at %td/%td\n", */ > + /* OPCODE(h), file->cursor - file->map, */ > + /* file->end - file->map); */ > + return -1; > + } > + > + next = p + header_length + bias; > + if ((h & 0xffff0000) == MAKE_HEADER(TYPE_AUB, OPCODE_AUB, > SUBOPCODE_BLOCK)) { > + assert(end - p >= 4); > + next += p[4] / 4; > + } > + > + assert(next <= end); > + > + switch (h & 0xffff0000) { > + case MAKE_HEADER(TYPE_AUB, OPCODE_AUB, SUBOPCODE_HEADER): > + handle_trace_header(read, p); > + break; > + case MAKE_HEADER(TYPE_AUB, OPCODE_AUB, SUBOPCODE_BLOCK): > + handle_trace_block(read, p); > + break; > + case MAKE_HEADER(TYPE_AUB, OPCODE_AUB, SUBOPCODE_BMP): > + break; > + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_VERSION): > + handle_memtrace_version(read, p); > + break; > + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_REG_WRITE): > + handle_memtrace_reg_write(read, p); > + break; > + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_WRITE): > + handle_memtrace_mem_write(read, p); > + break; > + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_POLL): > + /* fprintf(outfile, "memory poll block (dwords %d):\n", h & 0xffff); */ > + break; > + case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_REG_POLL): > + break; > + default: > + /* fprintf(outfile, "unknown block type=0x%x, opcode=0x%x, " */ > + /* "subopcode=0x%x (%08x)\n", TYPE(h), OPCODE(h), SUBOPCODE(h), > h); */ > + break; > + } > + > + return (next - p) * sizeof(*p); > +} > diff --git a/src/intel/tools/aub_read.h b/src/intel/tools/aub_read.h > new file mode 100644 > index 00000000000..3db8be8a23d > --- /dev/null > +++ b/src/intel/tools/aub_read.h > @@ -0,0 +1,75 @@ > +/* > + * Copyright © 2018 Intel Corporation > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the next > + * paragraph) shall be included in all copies or substantial portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER > DEALINGS > + * IN THE SOFTWARE. > + * > + */ > + > +#ifndef INTEL_AUB_READ > +#define INTEL_AUB_READ > + > +#include <stdint.h> > + > +#include "dev/gen_device_info.h" > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +enum gen_engine { > + GEN_ENGINE_RENDER = 1, > + GEN_ENGINE_BLITTER = 2, > +}; > + > +struct aub_read { > + /* Caller's data */ > + void *user_data; > + > + void (*info)(void *user_data, int pci_id, const char *app_name); > + > + 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); > + void (*ggtt_entry_write)(void *user_data, uint64_t phys_addr, > + const void *data, uint32_t data_len); > + > + void (*reg_write)(void *user_data, uint32_t reg_offset, uint32_t > reg_value); > + > + void (*ring_write)(void *user_data, enum gen_engine engine, > + const void *data, uint32_t data_len); > + void (*execlist_write)(void *user_data, enum gen_engine engine, > + uint64_t context_descriptor); > + > + /* Reader's data */ > + uint32_t render_elsp[4]; > + int render_elsp_index; > + uint32_t blitter_elsp[4]; > + int blitter_elsp_index; > + > + struct gen_device_info devinfo; > +}; > + > +int aub_read_command(struct aub_read *read, const void *data, uint32_t > data_len); > + > +#ifdef __cplusplus > +} > +#endif > + > +#endif /* INTEL_AUB_READ */ > diff --git a/src/intel/tools/aubinator.c b/src/intel/tools/aubinator.c > index 7caccb31d4d..b5622ff9eaa 100644 > --- a/src/intel/tools/aubinator.c > +++ b/src/intel/tools/aubinator.c > @@ -42,9 +42,8 @@ > #include "util/rb_tree.h" > > #include "common/gen_decoder.h" > -#include "common/gen_disasm.h" > -#include "common/gen_gem.h" > #include "intel_aub.h" > +#include "aub_read.h" > > #ifndef HAVE_MEMFD_CREATE > #include <sys/syscall.h> > @@ -233,7 +232,18 @@ search_phys_mem(uint64_t phys_addr) > } > > static void > -handle_ggtt_entry_write(uint64_t address, const void *_data, uint32_t _size) > +handle_local_write(void *user_data, uint64_t address, const void *data, > uint32_t size) > +{ > + struct gen_batch_decode_bo bo = { > + .map = data, > + .addr = address, > + .size = size, > + }; > + add_gtt_bo_map(bo, false); > +} > + > +static void > +handle_ggtt_entry_write(void *user_data, uint64_t address, const void > *_data, uint32_t _size) > { > uint64_t virt_addr = (address / sizeof(uint64_t)) << 12; > const uint64_t *data = _data; > @@ -247,7 +257,7 @@ handle_ggtt_entry_write(uint64_t address, const void > *_data, uint32_t _size) > } > > static void > -handle_physical_write(uint64_t phys_address, const void *data, uint32_t size) > +handle_physical_write(void *user_data, uint64_t phys_address, const void > *data, uint32_t size) > { > uint32_t to_write = size; > for (uint64_t page = phys_address & ~0xfff; page < phys_address + size; > page += 4096) { > @@ -261,7 +271,7 @@ handle_physical_write(uint64_t phys_address, const void > *data, uint32_t size) > } > > static void > -handle_ggtt_write(uint64_t virt_address, const void *data, uint32_t size) > +handle_ggtt_write(void *user_data, uint64_t virt_address, const void *data, > uint32_t size) > { > uint32_t to_write = size; > for (uint64_t page = virt_address & ~0xfff; page < virt_address + size; > page += 4096) { > @@ -273,7 +283,7 @@ handle_ggtt_write(uint64_t virt_address, const void > *data, uint32_t size) > to_write -= size_this_page; > > uint64_t phys_page = entry->phys_addr & ~0xfff; /* Clear the validity > bits. */ > - handle_physical_write(phys_page + offset, data, size_this_page); > + handle_physical_write(user_data, phys_page + offset, data, > size_this_page); > data = (const uint8_t *)data + size_this_page; > } > } > @@ -389,58 +399,11 @@ get_ppgtt_batch_bo(void *user_data, uint64_t address) > return bo; > } > > -#define GEN_ENGINE_RENDER 1 > -#define GEN_ENGINE_BLITTER 2 > - > static void > -handle_trace_block(uint32_t *p) > +aubinator_init(void *user_data, int aub_pci_id, const char *app_name) > { > - int operation = p[1] & AUB_TRACE_OPERATION_MASK; > - int type = p[1] & AUB_TRACE_TYPE_MASK; > - int address_space = p[1] & AUB_TRACE_ADDRESS_SPACE_MASK; > - int header_length = p[0] & 0xffff; > - int engine = GEN_ENGINE_RENDER; > - struct gen_batch_decode_bo bo = { > - .map = p + header_length + 2, > - /* Addresses written by aubdump here are in canonical form but the > batch > - * decoder always gives us addresses with the top 16bits zeroed, so do > - * the same here. > - */ > - .addr = gen_48b_address((devinfo.gen >= 8 ? ((uint64_t) p[5] << 32) : > 0) | > - ((uint64_t) p[3])), > - .size = p[4], > - }; > - > - switch (operation) { > - case AUB_TRACE_OP_DATA_WRITE: > - if (address_space == AUB_TRACE_MEMTYPE_GTT) > - add_gtt_bo_map(bo, false); > - break; > - case AUB_TRACE_OP_COMMAND_WRITE: > - switch (type) { > - case AUB_TRACE_TYPE_RING_PRB0: > - engine = GEN_ENGINE_RENDER; > - break; > - case AUB_TRACE_TYPE_RING_PRB2: > - engine = GEN_ENGINE_BLITTER; > - break; > - default: > - fprintf(outfile, "command write to unknown ring %d\n", type); > - break; > - } > - > - (void)engine; /* TODO */ > - batch_ctx.get_bo = get_ggtt_batch_bo; > - gen_print_batch(&batch_ctx, bo.map, bo.size, 0); > + pci_id = aub_pci_id; > > - clear_bo_maps(); > - break; > - } > -} > - > -static void > -aubinator_init(uint16_t aub_pci_id, const char *app_name) > -{ > if (!gen_get_device_info(pci_id, &devinfo)) { > fprintf(stderr, "can't find device information: pci_id=0x%x\n", > pci_id); > exit(EXIT_FAILURE); > @@ -481,111 +444,8 @@ aubinator_init(uint16_t aub_pci_id, const char > *app_name) > } > > static void > -handle_trace_header(uint32_t *p) > -{ > - /* The intel_aubdump tool from IGT is kind enough to put a PCI-ID= tag in > - * the AUB header comment. If the user hasn't specified a hardware > - * generation, try to use the one from the AUB file. > - */ > - uint32_t *end = p + (p[0] & 0xffff) + 2; > - int aub_pci_id = 0; > - if (end > &p[12] && p[12] > 0) > - sscanf((char *)&p[13], "PCI-ID=%i", &aub_pci_id); > - > - if (pci_id == 0) > - pci_id = aub_pci_id; > - > - char app_name[33]; > - strncpy(app_name, (char *)&p[2], 32); > - app_name[32] = 0; > - > - aubinator_init(aub_pci_id, app_name); > -} > - > -static void > -handle_memtrace_version(uint32_t *p) > +handle_execlist_write(void *user_data, enum gen_engine engine, uint64_t > context_descriptor) > { > - int header_length = p[0] & 0xffff; > - char app_name[64]; > - int app_name_len = MIN2(4 * (header_length + 1 - 5), ARRAY_SIZE(app_name) > - 1); > - int pci_id_len = 0; > - int aub_pci_id = 0; > - > - strncpy(app_name, (char *)&p[5], app_name_len); > - app_name[app_name_len] = 0; > - sscanf(app_name, "PCI-ID=%i %n", &aub_pci_id, &pci_id_len); > - if (pci_id == 0) > - pci_id = aub_pci_id; > - aubinator_init(aub_pci_id, app_name + pci_id_len); > -} > - > -static void > -handle_memtrace_reg_write(uint32_t *p) > -{ > - static struct execlist_regs { > - uint32_t render_elsp[4]; > - int render_elsp_index; > - uint32_t blitter_elsp[4]; > - int blitter_elsp_index; > - } state = {}; > - > - uint32_t offset = p[1]; > - uint32_t value = p[5]; > - > - int engine; > - uint64_t context_descriptor; > - > - switch (offset) { > - case 0x2230: /* render elsp */ > - state.render_elsp[state.render_elsp_index++] = value; > - if (state.render_elsp_index < 4) > - return; > - > - state.render_elsp_index = 0; > - engine = GEN_ENGINE_RENDER; > - context_descriptor = (uint64_t)state.render_elsp[2] << 32 | > - state.render_elsp[3]; > - break; > - case 0x22230: /* blitter elsp */ > - state.blitter_elsp[state.blitter_elsp_index++] = value; > - if (state.blitter_elsp_index < 4) > - return; > - > - state.blitter_elsp_index = 0; > - engine = GEN_ENGINE_BLITTER; > - context_descriptor = (uint64_t)state.blitter_elsp[2] << 32 | > - state.blitter_elsp[3]; > - break; > - case 0x2510: /* render elsq0 lo */ > - state.render_elsp[3] = value; > - return; > - break; > - case 0x2514: /* render elsq0 hi */ > - state.render_elsp[2] = value; > - return; > - break; > - case 0x22510: /* blitter elsq0 lo */ > - state.blitter_elsp[3] = value; > - return; > - break; > - case 0x22514: /* blitter elsq0 hi */ > - state.blitter_elsp[2] = value; > - return; > - break; > - case 0x2550: /* render elsc */ > - engine = GEN_ENGINE_RENDER; > - context_descriptor = (uint64_t)state.render_elsp[2] << 32 | > - state.render_elsp[3]; > - break; > - case 0x22550: /* blitter elsc */ > - engine = GEN_ENGINE_BLITTER; > - context_descriptor = (uint64_t)state.blitter_elsp[2] << 32 | > - state.blitter_elsp[3]; > - break; > - default: > - return; > - } > - > const uint32_t pphwsp_size = 4096; > uint32_t pphwsp_addr = context_descriptor & 0xfffff000; > struct gen_batch_decode_bo pphwsp_bo = get_ggtt_batch_bo(NULL, > pphwsp_addr); > @@ -617,40 +477,20 @@ handle_memtrace_reg_write(uint32_t *p) > } > > static void > -handle_memtrace_mem_write(uint32_t *p) > +handle_ring_write(void *user_data, enum gen_engine engine, > + const void *data, uint32_t data_len) > { > - struct gen_batch_decode_bo bo = { > - .map = p + 5, > - /* Addresses written by aubdump here are in canonical form but the > batch > - * decoder always gives us addresses with the top 16bits zeroed, so do > - * the same here. > - */ > - .addr = gen_48b_address(*(uint64_t*)&p[1]), > - .size = p[4], > - }; > - uint32_t address_space = p[3] >> 28; > - > - switch (address_space) { > - case 0: /* GGTT */ > - handle_ggtt_write(bo.addr, bo.map, bo.size); > - break; > - case 1: /* Local */ > - add_gtt_bo_map(bo, false); > - break; > - case 2: /* Physical */ > - handle_physical_write(bo.addr, bo.map, bo.size); > - break; > - case 4: /* GGTT Entry */ > - handle_ggtt_entry_write(bo.addr, bo.map, bo.size); > - break; > - } > + batch_ctx.get_bo = get_ggtt_batch_bo; > + > + gen_print_batch(&batch_ctx, data, data_len, 0); > + > + clear_bo_maps(); > } > > struct aub_file { > FILE *stream; > > - uint32_t *map, *end, *cursor; > - uint32_t *mem_end; > + void *map, *end, *cursor; > }; > > static struct aub_file * > @@ -682,103 +522,11 @@ aub_file_open(const char *filename) > close(fd); > > file->cursor = file->map; > - file->end = file->map + sb.st_size / 4; > + file->end = file->map + sb.st_size; > > return file; > } > > -#define TYPE(dw) (((dw) >> 29) & 7) > -#define OPCODE(dw) (((dw) >> 23) & 0x3f) > -#define SUBOPCODE(dw) (((dw) >> 16) & 0x7f) > - > -#define MAKE_HEADER(type, opcode, subopcode) \ > - (((type) << 29) | ((opcode) << 23) | ((subopcode) << 16)) > - > -#define TYPE_AUB 0x7 > - > -/* Classic AUB opcodes */ > -#define OPCODE_AUB 0x01 > -#define SUBOPCODE_HEADER 0x05 > -#define SUBOPCODE_BLOCK 0x41 > -#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 MAKE_GEN(major, minor) ( ((major) << 8) | (minor) ) > - > -static bool > -aub_file_decode_batch(struct aub_file *file) > -{ > - uint32_t *p, h, *new_cursor; > - int header_length, bias; > - > - assert(file->cursor < file->end); > - > - p = file->cursor; > - h = *p; > - header_length = h & 0xffff; > - > - switch (OPCODE(h)) { > - case OPCODE_AUB: > - bias = 2; > - break; > - case OPCODE_NEW_AUB: > - bias = 1; > - break; > - default: > - fprintf(outfile, "unknown opcode %d at %td/%td\n", > - OPCODE(h), file->cursor - file->map, > - file->end - file->map); > - return false; > - } > - > - new_cursor = p + header_length + bias; > - if ((h & 0xffff0000) == MAKE_HEADER(TYPE_AUB, OPCODE_AUB, > SUBOPCODE_BLOCK)) { > - assert(file->end - file->cursor >= 4); > - new_cursor += p[4] / 4; > - } > - > - assert(new_cursor <= file->end); > - > - switch (h & 0xffff0000) { > - case MAKE_HEADER(TYPE_AUB, OPCODE_AUB, SUBOPCODE_HEADER): > - handle_trace_header(p); > - break; > - case MAKE_HEADER(TYPE_AUB, OPCODE_AUB, SUBOPCODE_BLOCK): > - handle_trace_block(p); > - break; > - case MAKE_HEADER(TYPE_AUB, OPCODE_AUB, SUBOPCODE_BMP): > - break; > - case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_VERSION): > - handle_memtrace_version(p); > - break; > - case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_REG_WRITE): > - handle_memtrace_reg_write(p); > - break; > - case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_WRITE): > - handle_memtrace_mem_write(p); > - break; > - case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_POLL): > - fprintf(outfile, "memory poll block (dwords %d):\n", h & 0xffff); > - break; > - case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_REG_POLL): > - break; > - default: > - fprintf(outfile, "unknown block type=0x%x, opcode=0x%x, " > - "subopcode=0x%x (%08x)\n", TYPE(h), OPCODE(h), SUBOPCODE(h), h); > - break; > - } > - file->cursor = new_cursor; > - > - return true; > -} > - > static int > aub_file_more_stuff(struct aub_file *file) > { > @@ -907,8 +655,22 @@ int main(int argc, char *argv[]) > > file = aub_file_open(input_file); > > + struct aub_read aub_read = { > + .user_data = NULL, > + .info = aubinator_init, > + .local_write = handle_local_write, > + .phys_write = handle_physical_write, > + .ggtt_write = handle_ggtt_write, > + .ggtt_entry_write = handle_ggtt_entry_write, > + .execlist_write = handle_execlist_write, > + .ring_write = handle_ring_write, > + }; > + int consumed; > while (aub_file_more_stuff(file) && > - aub_file_decode_batch(file)); > + (consumed = aub_read_command(&aub_read, file->cursor, > + file->end - file->cursor)) > 0) { > + file->cursor += consumed; > + } > > fflush(stdout); > /* close the stdout which is opened to write the output */ > diff --git a/src/intel/tools/meson.build b/src/intel/tools/meson.build > index ac99adb4e1e..6be9fcf6413 100644 > --- a/src/intel/tools/meson.build > +++ b/src/intel/tools/meson.build > @@ -22,7 +22,7 @@ build_intel_tools = with_tools.contains('intel') > > aubinator = executable( > 'aubinator', > - files('aubinator.c', 'intel_aub.h'), > + files('aubinator.c', 'intel_aub.h', 'aub_read.h', 'aub_read.c'), > dependencies : [dep_expat, dep_zlib, dep_dl, dep_thread, dep_m], > include_directories : [inc_common, inc_intel], > link_with : [libintel_common, libintel_compiler, libintel_dev, > libmesa_util], > -- > 2.18.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev