intel/decoder: Engine parameter for instructions
authorToni Lönnberg <toni.lonnberg@intel.com>
Thu, 8 Nov 2018 12:48:20 +0000 (14:48 +0200)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Tue, 13 Nov 2018 15:10:12 +0000 (15:10 +0000)
Preliminary work for adding handling of different pipes to gen_decoder. Each
instruction needs to have a definition describing which engine it is meant for.
If left undefined, by default, the instruction is defined for all engines.

v2: Changed to use the engine class definitions from UAPI

v3: Changed I915_ENGINE_CLASS_TO_MASK to use BITSET_BIT, change engine to
engine_mask, added check for incorrect engine and added the possibility to
define an instruction to multiple engines using the "|" as a delimiter in the
engine attribute.

v4: Fixed the memory leak.

v5: Removed an unnecessary ralloc_free().

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/common/gen_decoder.c
src/intel/common/gen_decoder.h

index 8148b2f1489b37b8ac69d46107c13476a4cd70fa..326768fd721513c6e95390045d7ce6a4e5f0a394 100644 (file)
@@ -165,6 +165,9 @@ create_group(struct parser_context *ctx,
    group->fixed_length = fixed_length;
    group->dword_length_field = NULL;
    group->dw_length = 0;
+   group->engine_mask = I915_ENGINE_CLASS_TO_MASK(I915_ENGINE_CLASS_RENDER) |
+                        I915_ENGINE_CLASS_TO_MASK(I915_ENGINE_CLASS_VIDEO) |
+                        I915_ENGINE_CLASS_TO_MASK(I915_ENGINE_CLASS_COPY);
    group->bias = 1;
 
    for (int i = 0; atts[i]; i += 2) {
@@ -173,6 +176,28 @@ create_group(struct parser_context *ctx,
          group->dw_length = strtoul(atts[i + 1], &p, 0);
       } else if (strcmp(atts[i], "bias") == 0) {
          group->bias = strtoul(atts[i + 1], &p, 0);
+      } else if (strcmp(atts[i], "engine") == 0) {
+         void *mem_ctx = ralloc_context(NULL);
+         char *tmp = ralloc_strdup(mem_ctx, atts[i + 1]);
+         char *save_ptr;
+         char *tok = strtok_r(tmp, "|", &save_ptr);
+
+         group->engine_mask = 0;
+         while (tok != NULL) {
+            if (strcmp(tok, "render") == 0) {
+               group->engine_mask |= I915_ENGINE_CLASS_TO_MASK(I915_ENGINE_CLASS_RENDER);
+            } else if (strcmp(tok, "video") == 0) {
+               group->engine_mask |= I915_ENGINE_CLASS_TO_MASK(I915_ENGINE_CLASS_VIDEO);
+            } else if (strcmp(tok, "blitter") == 0) {
+               group->engine_mask |= I915_ENGINE_CLASS_TO_MASK(I915_ENGINE_CLASS_COPY);
+            } else {
+               fprintf(stderr, "unknown engine class defined for instruction \"%s\": %s\n", name, atts[i + 1]);
+            }
+
+            tok = strtok_r(NULL, "|", &save_ptr);
+         }
+
+         ralloc_free(mem_ctx);
       }
    }
 
index 4beed22d729a3ccb7a494b8afa57c031319d22a0..4311f58b4eb748e83bce2b9102f4d8dfc8769019 100644 (file)
@@ -30,6 +30,9 @@
 
 #include "dev/gen_device_info.h"
 #include "util/hash_table.h"
+#include "util/bitset.h"
+
+#include "drm-uapi/i915_drm.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -40,6 +43,8 @@ struct gen_group;
 struct gen_field;
 union gen_field_value;
 
+#define I915_ENGINE_CLASS_TO_MASK(x) BITSET_BIT(x)
+
 static inline uint32_t gen_make_gen(uint32_t major, uint32_t minor)
 {
    return (major << 8) | minor;
@@ -102,6 +107,7 @@ struct gen_group {
    struct gen_field *dword_length_field; /* <instruction> specific */
 
    uint32_t dw_length;
+   uint32_t engine_mask; /* <instruction> specific */
    uint32_t bias; /* <instruction> specific */
    uint32_t group_offset, group_count;
    uint32_t group_size;