<div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Hello,</div><div><br></div><div>Please find my comment below:<br></div><div dir="ltr"><br><div class="gmail_quote"><div dir="ltr">On Wed, Nov 7, 2018 at 4:49 PM Toni Lönnberg <<a href="mailto:toni.lonnberg@intel.com">toni.lonnberg@intel.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Preliminary work for adding handling of different pipes to gen_decoder. Each<br>
instruction needs to have a definition describing which engine it is meant for.<br>
If left undefined, by default, the instruction is defined for all engines.<br>
<br>
v2: Changed to use the engine class definitions from UAPI<br>
<br>
v3: Changed I915_ENGINE_CLASS_TO_MASK to use BITSET_BIT, change engine to<br>
engine_mask, added check for incorrect engine and added the possibility to<br>
define an instruction to multiple engines using the "|" as a delimiter in the<br>
engine attribute.<br>
---<br>
 src/intel/common/gen_decoder.c | 23 +++++++++++++++++++++++<br>
 src/intel/common/gen_decoder.h |  6 ++++++<br>
 2 files changed, 29 insertions(+)<br>
<br>
diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c<br>
index 8148b2f1489..79404660f56 100644<br>
--- a/src/intel/common/gen_decoder.c<br>
+++ b/src/intel/common/gen_decoder.c<br>
@@ -165,6 +165,9 @@ create_group(struct parser_context *ctx,<br>
    group->fixed_length = fixed_length;<br>
    group->dword_length_field = NULL;<br>
    group->dw_length = 0;<br>
+   group->engine_mask = I915_ENGINE_CLASS_TO_MASK(I915_ENGINE_CLASS_RENDER) |<br>
+                        I915_ENGINE_CLASS_TO_MASK(I915_ENGINE_CLASS_VIDEO) |<br>
+                        I915_ENGINE_CLASS_TO_MASK(I915_ENGINE_CLASS_COPY);<br>
    group->bias = 1;<br>
<br>
    for (int i = 0; atts[i]; i += 2) {<br>
@@ -173,6 +176,26 @@ create_group(struct parser_context *ctx,<br>
          group->dw_length = strtoul(atts[i + 1], &p, 0);<br>
       } else if (strcmp(atts[i], "bias") == 0) {<br>
          group->bias = strtoul(atts[i + 1], &p, 0);<br>
+      } else if (strcmp(atts[i], "engine") == 0) {<br>
+         void *mem_ctx = ralloc_context(NULL);<br>
+         char *tmp = ralloc_strdup(mem_ctx, atts[i + 1]);<br>
+         char *save_ptr;<br>
+         char *tok = strtok_r(tmp, "|", &save_ptr);<br>
+<br>
+         group->engine_mask = 0;<br>
+         while (tok != NULL) {<br>
+            if (strcmp(tok, "render") == 0) {<br>
+               group->engine_mask |= I915_ENGINE_CLASS_TO_MASK(I915_ENGINE_CLASS_RENDER);<br>
+            } else if (strcmp(tok, "video") == 0) {<br>
+               group->engine_mask |= I915_ENGINE_CLASS_TO_MASK(I915_ENGINE_CLASS_VIDEO);<br>
+            } else if (strcmp(tok, "blitter") == 0) {<br>
+               group->engine_mask |= I915_ENGINE_CLASS_TO_MASK(I915_ENGINE_CLASS_COPY);<br>
+            } else {<br>
+               fprintf(stderr, "unknown engine class defined for instruction \"%s\": %s\n", name, atts[i + 1]);<br>
+            }<br>
+<br>
+            tok = strtok_r(NULL, "|", &save_ptr);<br>
+         }<br></blockquote><div><br></div><div>Seems like 'ralloc_free(mem_ctx)' is missing here :-)</div><div><br></div><div>Regards,<br></div><div>- Andrii<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
       }<br>
    }<br>
<br>
diff --git a/src/intel/common/gen_decoder.h b/src/intel/common/gen_decoder.h<br>
index 4beed22d729..4311f58b4eb 100644<br>
--- a/src/intel/common/gen_decoder.h<br>
+++ b/src/intel/common/gen_decoder.h<br>
@@ -30,6 +30,9 @@<br>
<br>
 #include "dev/gen_device_info.h"<br>
 #include "util/hash_table.h"<br>
+#include "util/bitset.h"<br>
+<br>
+#include "drm-uapi/i915_drm.h"<br>
<br>
 #ifdef __cplusplus<br>
 extern "C" {<br>
@@ -40,6 +43,8 @@ struct gen_group;<br>
 struct gen_field;<br>
 union gen_field_value;<br>
<br>
+#define I915_ENGINE_CLASS_TO_MASK(x) BITSET_BIT(x)<br>
+<br>
 static inline uint32_t gen_make_gen(uint32_t major, uint32_t minor)<br>
 {<br>
    return (major << 8) | minor;<br>
@@ -102,6 +107,7 @@ struct gen_group {<br>
    struct gen_field *dword_length_field; /* <instruction> specific */<br>
<br>
    uint32_t dw_length;<br>
+   uint32_t engine_mask; /* <instruction> specific */<br>
    uint32_t bias; /* <instruction> specific */<br>
    uint32_t group_offset, group_count;<br>
    uint32_t group_size;<br>
-- <br>
2.17.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div></div></div></div></div>