[Mesa-dev] [PATCH 07/14] intel: tools: split aub parsing from aubinator
Rafael Antognolli
rafael.antognolli at intel.com
Sat Aug 4 00:17:50 UTC 2018
Looks like no functional change, and it's needed by the ui tool, so
Reviewed-by: Rafael Antognolli <rafael.antognolli at intel.com>
On Thu, Aug 02, 2018 at 10:39:19AM +0100, Lionel Landwerlin wrote:
> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list