intel/tools: Handle GT_MODE in the batch decoder
authorJason Ekstrand <jason@jlekstrand.net>
Mon, 11 May 2020 20:31:57 +0000 (15:31 -0500)
committerJason Ekstrand <jason@jlekstrand.net>
Sat, 20 Mar 2021 17:46:50 +0000 (12:46 -0500)
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9729>

src/intel/common/intel_batch_decoder.c
src/intel/common/intel_decoder.h

index 0b5020c..67c5244 100644 (file)
@@ -253,6 +253,10 @@ dump_binding_table(struct intel_batch_decode_ctx *ctx, uint32_t offset, int coun
       return;
    }
 
+   /* When 256B binding tables are enabled, we have to shift the offset */
+   if (ctx->use_256B_binding_tables)
+      offset <<= 3;
+
    if (count < 0) {
       count = update_count(ctx, ctx->surface_base + offset,
                            ctx->surface_base, 1, 8);
@@ -853,6 +857,38 @@ decode_3dstate_slice_table_state_pointers(struct intel_batch_decode_ctx *ctx,
 }
 
 static void
+handle_gt_mode(struct intel_batch_decode_ctx *ctx,
+               uint32_t reg_addr, uint32_t val)
+{
+   struct intel_group *reg = intel_spec_find_register(ctx->spec, reg_addr);
+
+   struct intel_field_iterator iter;
+   intel_field_iterator_init(&iter, reg, &val, 0, false);
+
+   uint32_t bt_alignment;
+   bool bt_alignment_mask = 0;
+
+   while (intel_field_iterator_next(&iter)) {
+      if (strcmp(iter.name, "Binding Table Alignment") == 0) {
+         bt_alignment = iter.raw_value;
+      } else if (strcmp(iter.name, "Binding Table Alignment Mask") == 0) {
+         bt_alignment_mask = iter.raw_value;
+      }
+   }
+
+   if (bt_alignment_mask)
+      ctx->use_256B_binding_tables = bt_alignment;
+}
+
+struct reg_handler {
+   const char *name;
+   void (*handler)(struct intel_batch_decode_ctx *ctx,
+                   uint32_t reg_addr, uint32_t val);
+} reg_handlers[] = {
+   { "GT_MODE", handle_gt_mode }
+};
+
+static void
 decode_load_register_imm(struct intel_batch_decode_ctx *ctx, const uint32_t *p)
 {
    struct intel_group *inst = intel_ctx_find_instruction(ctx, p);
@@ -866,6 +902,11 @@ decode_load_register_imm(struct intel_batch_decode_ctx *ctx, const uint32_t *p)
          fprintf(ctx->fp, "register %s (0x%x): 0x%x\n",
                  reg->name, reg->register_offset, p[2]);
          ctx_print_group(ctx, reg, reg->register_offset, &p[2]);
+
+         for (unsigned i = 0; i < ARRAY_SIZE(reg_handlers); i++) {
+            if (strcmp(reg->name, reg_handlers[i].name) == 0)
+               reg_handlers[i].handler(ctx, p[1], p[2]);
+         }
       }
    }
 }
index 580d59c..697eb69 100644 (file)
@@ -240,6 +240,7 @@ struct intel_batch_decode_ctx {
    struct intel_spec *spec;
    enum intel_batch_decode_flags flags;
 
+   bool use_256B_binding_tables;
    uint64_t surface_base;
    uint64_t dynamic_base;
    uint64_t instruction_base;