summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/intel/common/gen_batch_decoder.c25
-rw-r--r--src/intel/common/gen_decoder.c7
-rw-r--r--src/intel/common/gen_decoder.h6
-rw-r--r--src/intel/tools/aubinator.c3
-rw-r--r--src/intel/tools/aubinator_error_decode.c73
-rw-r--r--src/intel/tools/aubinator_viewer.cpp4
-rw-r--r--src/intel/tools/aubinator_viewer.h1
-rw-r--r--src/intel/tools/aubinator_viewer_decoder.cpp3
8 files changed, 69 insertions, 53 deletions
diff --git a/src/intel/common/gen_batch_decoder.c b/src/intel/common/gen_batch_decoder.c
index 36ee7706e40..ff29074c6d1 100644
--- a/src/intel/common/gen_batch_decoder.c
+++ b/src/intel/common/gen_batch_decoder.c
@@ -45,6 +45,7 @@ gen_batch_decode_ctx_init(struct gen_batch_decode_ctx *ctx,
ctx->fp = fp;
ctx->flags = flags;
ctx->max_vbo_decoded_lines = -1; /* No limit! */
+ ctx->engine = I915_ENGINE_CLASS_RENDER;
if (xml_path == NULL)
ctx->spec = gen_spec_load(devinfo);
@@ -192,10 +193,16 @@ ctx_print_buffer(struct gen_batch_decode_ctx *ctx,
fprintf(ctx->fp, "\n");
}
+static struct gen_group *
+gen_ctx_find_instruction(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
+{
+ return gen_spec_find_instruction(ctx->spec, ctx->engine, p);
+}
+
static void
handle_state_base_address(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
{
- struct gen_group *inst = gen_spec_find_instruction(ctx->spec, p);
+ struct gen_group *inst = gen_ctx_find_instruction(ctx, p);
struct gen_field_iterator iter;
gen_field_iterator_init(&iter, inst, p, 0, false);
@@ -309,7 +316,7 @@ static void
handle_media_interface_descriptor_load(struct gen_batch_decode_ctx *ctx,
const uint32_t *p)
{
- struct gen_group *inst = gen_spec_find_instruction(ctx->spec, p);
+ struct gen_group *inst = gen_ctx_find_instruction(ctx, p);
struct gen_group *desc =
gen_spec_find_struct(ctx->spec, "INTERFACE_DESCRIPTOR_DATA");
@@ -373,7 +380,7 @@ static void
handle_3dstate_vertex_buffers(struct gen_batch_decode_ctx *ctx,
const uint32_t *p)
{
- struct gen_group *inst = gen_spec_find_instruction(ctx->spec, p);
+ struct gen_group *inst = gen_ctx_find_instruction(ctx, p);
struct gen_group *vbs = gen_spec_find_struct(ctx->spec, "VERTEX_BUFFER_STATE");
struct gen_batch_decode_bo vb = {};
@@ -436,7 +443,7 @@ static void
handle_3dstate_index_buffer(struct gen_batch_decode_ctx *ctx,
const uint32_t *p)
{
- struct gen_group *inst = gen_spec_find_instruction(ctx->spec, p);
+ struct gen_group *inst = gen_ctx_find_instruction(ctx, p);
struct gen_batch_decode_bo ib = {};
uint32_t ib_size = 0;
@@ -486,7 +493,7 @@ handle_3dstate_index_buffer(struct gen_batch_decode_ctx *ctx,
static void
decode_single_ksp(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
{
- struct gen_group *inst = gen_spec_find_instruction(ctx->spec, p);
+ struct gen_group *inst = gen_ctx_find_instruction(ctx, p);
uint64_t ksp = 0;
bool is_simd8 = false; /* vertex shaders on Gen8+ only */
@@ -528,7 +535,7 @@ decode_single_ksp(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
static void
decode_ps_kernels(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
{
- struct gen_group *inst = gen_spec_find_instruction(ctx->spec, p);
+ struct gen_group *inst = gen_ctx_find_instruction(ctx, p);
uint64_t ksp[3] = {0, 0, 0};
bool enabled[3] = {false, false, false};
@@ -576,7 +583,7 @@ decode_ps_kernels(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
static void
decode_3dstate_constant(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
{
- struct gen_group *inst = gen_spec_find_instruction(ctx->spec, p);
+ struct gen_group *inst = gen_ctx_find_instruction(ctx, p);
struct gen_group *body =
gen_spec_find_struct(ctx->spec, "3DSTATE_CONSTANT_BODY");
@@ -658,7 +665,7 @@ decode_dynamic_state_pointers(struct gen_batch_decode_ctx *ctx,
const char *struct_type, const uint32_t *p,
int count)
{
- struct gen_group *inst = gen_spec_find_instruction(ctx->spec, p);
+ struct gen_group *inst = gen_ctx_find_instruction(ctx, p);
uint32_t state_offset = 0;
@@ -802,7 +809,7 @@ gen_print_batch(struct gen_batch_decode_ctx *ctx,
struct gen_group *inst;
for (p = batch; p < end; p += length) {
- inst = gen_spec_find_instruction(ctx->spec, p);
+ inst = gen_ctx_find_instruction(ctx, p);
length = gen_group_get_length(inst, p);
assert(inst == NULL || length > 0);
length = MAX2(1, length);
diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c
index 326768fd721..50ef2c4204f 100644
--- a/src/intel/common/gen_decoder.c
+++ b/src/intel/common/gen_decoder.c
@@ -733,12 +733,15 @@ void gen_spec_destroy(struct gen_spec *spec)
}
struct gen_group *
-gen_spec_find_instruction(struct gen_spec *spec, const uint32_t *p)
+gen_spec_find_instruction(struct gen_spec *spec,
+ enum drm_i915_gem_engine_class engine,
+ const uint32_t *p)
{
hash_table_foreach(spec->commands, entry) {
struct gen_group *command = entry->data;
uint32_t opcode = *p & command->opcode_mask;
- if (opcode == command->opcode)
+ if ((command->engine_mask & I915_ENGINE_CLASS_TO_MASK(engine)) &&
+ opcode == command->opcode)
return command;
}
diff --git a/src/intel/common/gen_decoder.h b/src/intel/common/gen_decoder.h
index 4311f58b4eb..ae624c6054d 100644
--- a/src/intel/common/gen_decoder.h
+++ b/src/intel/common/gen_decoder.h
@@ -56,7 +56,9 @@ struct gen_spec *gen_spec_load_from_path(const struct gen_device_info *devinfo,
const char *path);
void gen_spec_destroy(struct gen_spec *spec);
uint32_t gen_spec_get_gen(struct gen_spec *spec);
-struct gen_group *gen_spec_find_instruction(struct gen_spec *spec, const uint32_t *p);
+struct gen_group *gen_spec_find_instruction(struct gen_spec *spec,
+ enum drm_i915_gem_engine_class engine,
+ const uint32_t *p);
struct gen_group *gen_spec_find_register(struct gen_spec *spec, uint32_t offset);
struct gen_group *gen_spec_find_register_by_name(struct gen_spec *spec, const char *name);
struct gen_enum *gen_spec_find_enum(struct gen_spec *spec, const char *name);
@@ -233,6 +235,8 @@ struct gen_batch_decode_ctx {
uint64_t instruction_base;
int max_vbo_decoded_lines;
+
+ enum drm_i915_gem_engine_class engine;
};
void gen_batch_decode_ctx_init(struct gen_batch_decode_ctx *ctx,
diff --git a/src/intel/tools/aubinator.c b/src/intel/tools/aubinator.c
index ed758a62503..f3bd006a8ab 100644
--- a/src/intel/tools/aubinator.c
+++ b/src/intel/tools/aubinator.c
@@ -157,7 +157,7 @@ handle_execlist_write(void *user_data, enum drm_i915_gem_engine_class engine, ui
batch_ctx.get_bo = aub_mem_get_ggtt_bo;
}
- (void)engine; /* TODO */
+ batch_ctx.engine = engine;
gen_print_batch(&batch_ctx, commands, ring_buffer_tail - ring_buffer_head,
0);
aub_mem_clear_bo_maps(&mem);
@@ -170,6 +170,7 @@ handle_ring_write(void *user_data, enum drm_i915_gem_engine_class engine,
batch_ctx.user_data = &mem;
batch_ctx.get_bo = aub_mem_get_ggtt_bo;
+ batch_ctx.engine = engine;
gen_print_batch(&batch_ctx, data, data_len, 0);
aub_mem_clear_bo_maps(&mem);
diff --git a/src/intel/tools/aubinator_error_decode.c b/src/intel/tools/aubinator_error_decode.c
index c581414eb2c..49f0738e881 100644
--- a/src/intel/tools/aubinator_error_decode.c
+++ b/src/intel/tools/aubinator_error_decode.c
@@ -76,49 +76,42 @@ print_register(struct gen_spec *spec, const char *name, uint32_t reg)
}
struct ring_register_mapping {
- unsigned ring_class;
+ enum drm_i915_gem_engine_class ring_class;
unsigned ring_instance;
const char *register_name;
};
-enum {
- RCS,
- BCS,
- VCS,
- VECS,
-};
-
static const struct ring_register_mapping acthd_registers[] = {
- { BCS, 0, "BCS_ACTHD_UDW" },
- { VCS, 0, "VCS_ACTHD_UDW" },
- { VCS, 1, "VCS2_ACTHD_UDW" },
- { RCS, 0, "ACTHD_UDW" },
- { VECS, 0, "VECS_ACTHD_UDW" },
+ { I915_ENGINE_CLASS_COPY, 0, "BCS_ACTHD_UDW" },
+ { I915_ENGINE_CLASS_VIDEO, 0, "VCS_ACTHD_UDW" },
+ { I915_ENGINE_CLASS_VIDEO, 1, "VCS2_ACTHD_UDW" },
+ { I915_ENGINE_CLASS_RENDER, 0, "ACTHD_UDW" },
+ { I915_ENGINE_CLASS_VIDEO_ENHANCE, 0, "VECS_ACTHD_UDW" },
};
static const struct ring_register_mapping ctl_registers[] = {
- { BCS, 0, "BCS_RING_BUFFER_CTL" },
- { VCS, 0, "VCS_RING_BUFFER_CTL" },
- { VCS, 1, "VCS2_RING_BUFFER_CTL" },
- { RCS, 0, "RCS_RING_BUFFER_CTL" },
- { VECS, 0, "VECS_RING_BUFFER_CTL" },
+ { I915_ENGINE_CLASS_COPY, 0, "BCS_RING_BUFFER_CTL" },
+ { I915_ENGINE_CLASS_VIDEO, 0, "VCS_RING_BUFFER_CTL" },
+ { I915_ENGINE_CLASS_VIDEO, 1, "VCS2_RING_BUFFER_CTL" },
+ { I915_ENGINE_CLASS_RENDER, 0, "RCS_RING_BUFFER_CTL" },
+ { I915_ENGINE_CLASS_VIDEO_ENHANCE, 0, "VECS_RING_BUFFER_CTL" },
};
static const struct ring_register_mapping fault_registers[] = {
- { BCS, 0, "BCS_FAULT_REG" },
- { VCS, 0, "VCS_FAULT_REG" },
- { RCS, 0, "RCS_FAULT_REG" },
- { VECS, 0, "VECS_FAULT_REG" },
+ { I915_ENGINE_CLASS_COPY, 0, "BCS_FAULT_REG" },
+ { I915_ENGINE_CLASS_VIDEO, 0, "VCS_FAULT_REG" },
+ { I915_ENGINE_CLASS_RENDER, 0, "RCS_FAULT_REG" },
+ { I915_ENGINE_CLASS_VIDEO_ENHANCE, 0, "VECS_FAULT_REG" },
};
static int ring_name_to_class(const char *ring_name,
- unsigned int *class)
+ enum drm_i915_gem_engine_class *class)
{
static const char *class_names[] = {
- [RCS] = "rcs",
- [BCS] = "bcs",
- [VCS] = "vcs",
- [VECS] = "vecs",
+ [I915_ENGINE_CLASS_RENDER] = "rcs",
+ [I915_ENGINE_CLASS_COPY] = "bcs",
+ [I915_ENGINE_CLASS_VIDEO] = "vcs",
+ [I915_ENGINE_CLASS_VIDEO_ENHANCE] = "vecs",
};
for (size_t i = 0; i < ARRAY_SIZE(class_names); i++) {
if (strncmp(ring_name, class_names[i], strlen(class_names[i])))
@@ -133,11 +126,11 @@ static int ring_name_to_class(const char *ring_name,
unsigned int class;
int instance;
} legacy_names[] = {
- { "render", RCS, 0 },
- { "blt", BCS, 0 },
- { "bsd", VCS, 0 },
- { "bsd2", VCS, 1 },
- { "vebox", VECS, 0 },
+ { "render", I915_ENGINE_CLASS_RENDER, 0 },
+ { "blt", I915_ENGINE_CLASS_COPY, 0 },
+ { "bsd", I915_ENGINE_CLASS_VIDEO, 0 },
+ { "bsd2", I915_ENGINE_CLASS_VIDEO, 1 },
+ { "vebox", I915_ENGINE_CLASS_VIDEO_ENHANCE, 0 },
};
for (size_t i = 0; i < ARRAY_SIZE(legacy_names); i++) {
if (strcmp(ring_name, legacy_names[i].name))
@@ -155,7 +148,7 @@ register_name_from_ring(const struct ring_register_mapping *mapping,
unsigned nb_mapping,
const char *ring_name)
{
- unsigned int class;
+ enum drm_i915_gem_engine_class class;
int instance;
instance = ring_name_to_class(ring_name, &class);
@@ -174,7 +167,7 @@ static const char *
instdone_register_for_ring(const struct gen_device_info *devinfo,
const char *ring_name)
{
- unsigned int class;
+ enum drm_i915_gem_engine_class class;
int instance;
instance = ring_name_to_class(ring_name, &class);
@@ -182,16 +175,16 @@ instdone_register_for_ring(const struct gen_device_info *devinfo,
return NULL;
switch (class) {
- case RCS:
+ case I915_ENGINE_CLASS_RENDER:
if (devinfo->gen == 6)
return "INSTDONE_2";
else
return "INSTDONE_1";
- case BCS:
+ case I915_ENGINE_CLASS_COPY:
return "BCS_INSTDONE";
- case VCS:
+ case I915_ENGINE_CLASS_VIDEO:
switch (instance) {
case 0:
return "VCS_INSTDONE";
@@ -201,7 +194,7 @@ instdone_register_for_ring(const struct gen_device_info *devinfo,
return NULL;
}
- case VECS:
+ case I915_ENGINE_CLASS_VIDEO_ENHANCE:
return "VECS_INSTDONE";
}
@@ -601,6 +594,9 @@ read_data_file(FILE *file)
for (int s = 0; s < num_sections; s++) {
+ enum drm_i915_gem_engine_class class;
+ ring_name_to_class(sections[s].ring_name, &class);
+
printf("--- %s (%s) at 0x%08x %08x\n",
sections[s].buffer_name, sections[s].ring_name,
(unsigned) (sections[s].gtt_offset >> 32),
@@ -610,6 +606,7 @@ read_data_file(FILE *file)
strcmp(sections[s].buffer_name, "batch buffer") == 0 ||
strcmp(sections[s].buffer_name, "ring buffer") == 0 ||
strcmp(sections[s].buffer_name, "HW Context") == 0) {
+ batch_ctx.engine = class;
gen_print_batch(&batch_ctx, sections[s].data,
sections[s].dword_count * 4,
sections[s].gtt_offset);
diff --git a/src/intel/tools/aubinator_viewer.cpp b/src/intel/tools/aubinator_viewer.cpp
index fe7c32a92a4..d3638c70011 100644
--- a/src/intel/tools/aubinator_viewer.cpp
+++ b/src/intel/tools/aubinator_viewer.cpp
@@ -706,7 +706,8 @@ display_batch_ring_write(void *user_data, enum drm_i915_gem_engine_class engine,
}
static void
-display_batch_execlist_write(void *user_data, enum drm_i915_gem_engine_class,
+display_batch_execlist_write(void *user_data,
+ enum drm_i915_gem_engine_class engine,
uint64_t context_descriptor)
{
struct batch_window *window = (struct batch_window *) user_data;
@@ -732,6 +733,7 @@ display_batch_execlist_write(void *user_data, enum drm_i915_gem_engine_class,
window->uses_ppgtt = true;
+ window->decode_ctx.engine = engine;
aub_viewer_render_batch(&window->decode_ctx, commands,
ring_buffer_tail - ring_buffer_head,
ring_buffer_start);
diff --git a/src/intel/tools/aubinator_viewer.h b/src/intel/tools/aubinator_viewer.h
index 4a030efc0d0..7819e593462 100644
--- a/src/intel/tools/aubinator_viewer.h
+++ b/src/intel/tools/aubinator_viewer.h
@@ -68,6 +68,7 @@ struct aub_viewer_decode_ctx {
struct gen_spec *spec;
struct gen_disasm *disasm;
+ enum drm_i915_gem_engine_class engine;
struct aub_viewer_cfg *cfg;
struct aub_viewer_decode_cfg *decode_cfg;
diff --git a/src/intel/tools/aubinator_viewer_decoder.cpp b/src/intel/tools/aubinator_viewer_decoder.cpp
index 59cde530409..8aeddaf432c 100644
--- a/src/intel/tools/aubinator_viewer_decoder.cpp
+++ b/src/intel/tools/aubinator_viewer_decoder.cpp
@@ -42,6 +42,7 @@ aub_viewer_decode_ctx_init(struct aub_viewer_decode_ctx *ctx,
ctx->get_bo = get_bo;
ctx->get_state_size = get_state_size;
ctx->user_data = user_data;
+ ctx->engine = I915_ENGINE_CLASS_RENDER;
ctx->cfg = cfg;
ctx->decode_cfg = decode_cfg;
@@ -871,7 +872,7 @@ aub_viewer_render_batch(struct aub_viewer_decode_ctx *ctx,
int length;
for (p = batch; p < end; p += length) {
- inst = gen_spec_find_instruction(ctx->spec, p);
+ inst = gen_spec_find_instruction(ctx->spec, ctx->engine, p);
length = gen_group_get_length(inst, p);
assert(inst == NULL || length > 0);
length = MAX2(1, length);