Module: Mesa
Branch: main
Commit: 15d6c6ab1102e933d2bd6b419946b163e0596116
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=15d6c6ab1102e933d2bd6b419946b163e0596116

Author: Francisco Jerez <curroje...@riseup.net>
Date:   Fri Feb 18 22:21:53 2022 -0800

intel/eu/xe2+: Add support for 10-bit SWSB representation on Xe2+ platforms.

This implements the extended 10-bit encoding of the software
scoreboard information used by Xe2 platforms.  The new encoding is
different enough that there are few opportunities for sharing code
during translation to machine code, but the high-level tgl_swsb
representation remains roughly the same.

Among other changes the 10-bit SWSB format provides 5 bits worth of
SBID tokens (though they're only usable in large GRF mode) instead of
4 bits, the extended math pipeline is handled as an in-order (RegDist)
pipeline instead of as an out-of-order one, and the dual-argument
encodings support additional combinations of RegDist and SBID
synchronization modes.  A new encoding is introduced for preventing
the accumulator hardware scoreboard from being updated, but this is
currently not needed.

Reviewed-by: Lionel Landwerlin <lionel.g.landwer...@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25514>

---

 src/intel/compiler/brw_disasm.c     |   2 +-
 src/intel/compiler/brw_eu_defines.h | 121 ++++++++++++++++++++++++++++--------
 2 files changed, 95 insertions(+), 28 deletions(-)

diff --git a/src/intel/compiler/brw_disasm.c b/src/intel/compiler/brw_disasm.c
index f7d1c6c6f87..07a84335526 100644
--- a/src/intel/compiler/brw_disasm.c
+++ b/src/intel/compiler/brw_disasm.c
@@ -1823,7 +1823,7 @@ swsb(FILE *file, const struct brw_isa_info *isa, const 
brw_inst *inst)
 {
    const struct intel_device_info *devinfo = isa->devinfo;
    const enum opcode opcode = brw_inst_opcode(isa, inst);
-   const uint8_t x = brw_inst_swsb(devinfo, inst);
+   const uint32_t x = brw_inst_swsb(devinfo, inst);
    const bool is_unordered =
       opcode == BRW_OPCODE_SEND || opcode == BRW_OPCODE_SENDC ||
       opcode == BRW_OPCODE_MATH ||
diff --git a/src/intel/compiler/brw_eu_defines.h 
b/src/intel/compiler/brw_eu_defines.h
index b01c221af76..d837278faf0 100644
--- a/src/intel/compiler/brw_eu_defines.h
+++ b/src/intel/compiler/brw_eu_defines.h
@@ -1168,6 +1168,7 @@ enum tgl_pipe {
    TGL_PIPE_FLOAT,
    TGL_PIPE_INT,
    TGL_PIPE_LONG,
+   TGL_PIPE_MATH,
    TGL_PIPE_ALL
 };
 
@@ -1178,7 +1179,7 @@ enum tgl_pipe {
 struct tgl_swsb {
    unsigned regdist : 3;
    enum tgl_pipe pipe : 3;
-   unsigned sbid : 4;
+   unsigned sbid : 5;
    enum tgl_sbid_mode mode : 3;
 };
 
@@ -1245,21 +1246,46 @@ tgl_swsb_src_dep(struct tgl_swsb swsb)
  * Convert the provided tgl_swsb to the hardware's binary representation of an
  * SWSB annotation.
  */
-static inline uint8_t
+static inline uint32_t
 tgl_swsb_encode(const struct intel_device_info *devinfo, struct tgl_swsb swsb)
 {
    if (!swsb.mode) {
       const unsigned pipe = devinfo->verx10 < 125 ? 0 :
          swsb.pipe == TGL_PIPE_FLOAT ? 0x10 :
          swsb.pipe == TGL_PIPE_INT ? 0x18 :
-         swsb.pipe == TGL_PIPE_LONG ? 0x50 :
+         swsb.pipe == TGL_PIPE_LONG ? 0x20 :
+         swsb.pipe == TGL_PIPE_MATH ? 0x28 :
          swsb.pipe == TGL_PIPE_ALL ? 0x8 : 0;
       return pipe | swsb.regdist;
+
    } else if (swsb.regdist) {
-      return 0x80 | swsb.regdist << 4 | swsb.sbid;
+      if (devinfo->ver >= 20) {
+         if ((swsb.mode & TGL_SBID_SET)) {
+            assert(swsb.pipe == TGL_PIPE_ALL ||
+                   swsb.pipe == TGL_PIPE_INT || swsb.pipe == TGL_PIPE_FLOAT);
+            return (swsb.pipe == TGL_PIPE_INT ? 0x300 :
+                    swsb.pipe == TGL_PIPE_FLOAT ? 0x200 : 0x100) |
+                   swsb.regdist << 5 | swsb.sbid;
+         } else {
+            assert(!(swsb.mode & ~(TGL_SBID_DST | TGL_SBID_SRC)));
+            return (swsb.pipe == TGL_PIPE_ALL ? 0x300 :
+                    swsb.mode == TGL_SBID_SRC ? 0x200 : 0x100) |
+                   swsb.regdist << 5 | swsb.sbid;
+         }
+      } else {
+         assert(!(swsb.sbid & ~0xfu));
+         return 0x80 | swsb.regdist << 4 | swsb.sbid;
+      }
+
    } else {
-      return swsb.sbid | (swsb.mode & TGL_SBID_SET ? 0x40 :
-                          swsb.mode & TGL_SBID_DST ? 0x20 : 0x30);
+      if (devinfo->ver >= 20) {
+         return swsb.sbid | (swsb.mode & TGL_SBID_SET ? 0xc0 :
+                             swsb.mode & TGL_SBID_DST ? 0x80 : 0xa0);
+      } else {
+         assert(!(swsb.sbid & ~0xfu));
+         return swsb.sbid | (swsb.mode & TGL_SBID_SET ? 0x40 :
+                             swsb.mode & TGL_SBID_DST ? 0x20 : 0x30);
+      }
    }
 }
 
@@ -1269,29 +1295,70 @@ tgl_swsb_encode(const struct intel_device_info 
*devinfo, struct tgl_swsb swsb)
  */
 static inline struct tgl_swsb
 tgl_swsb_decode(const struct intel_device_info *devinfo,
-                const bool is_unordered, const uint8_t x)
+                const bool is_unordered, const uint32_t x)
 {
-   if (x & 0x80) {
-      const struct tgl_swsb swsb = { (x & 0x70u) >> 4, TGL_PIPE_NONE,
-                                     x & 0xfu,
-                                     is_unordered ?
-                                     TGL_SBID_SET : TGL_SBID_DST };
-      return swsb;
-   } else if ((x & 0x70) == 0x20) {
-      return tgl_swsb_sbid(TGL_SBID_DST, x & 0xfu);
-   } else if ((x & 0x70) == 0x30) {
-      return tgl_swsb_sbid(TGL_SBID_SRC, x & 0xfu);
-   } else if ((x & 0x70) == 0x40) {
-      return tgl_swsb_sbid(TGL_SBID_SET, x & 0xfu);
+   if (devinfo->ver >= 20) {
+      if (x & 0x300) {
+         if (is_unordered) {
+            const struct tgl_swsb swsb = {
+               (x & 0xe0u) >> 5,
+               ((x & 0x300) == 0x300 ? TGL_PIPE_INT :
+                (x & 0x300) == 0x200 ? TGL_PIPE_FLOAT :
+                TGL_PIPE_ALL),
+               x & 0x1fu,
+               TGL_SBID_SET
+            };
+            return swsb;
+         } else {
+            const struct tgl_swsb swsb = {
+               (x & 0xe0u) >> 5,
+               ((x & 0x300) == 0x300 ? TGL_PIPE_ALL : TGL_PIPE_NONE),
+               x & 0x1fu,
+               ((x & 0x300) == 0x200 ? TGL_SBID_SRC : TGL_SBID_DST)
+            };
+            return swsb;
+         }
+
+      } else if ((x & 0xe0) == 0x80) {
+         return tgl_swsb_sbid(TGL_SBID_DST, x & 0x1f);
+      } else if ((x & 0xe0) == 0xa0) {
+         return tgl_swsb_sbid(TGL_SBID_SRC, x & 0x1fu);
+      } else if ((x & 0xe0) == 0xc0) {
+         return tgl_swsb_sbid(TGL_SBID_SET, x & 0x1fu);
+      } else {
+            const struct tgl_swsb swsb = { x & 0x7u,
+                                           ((x & 0x38) == 0x10 ? 
TGL_PIPE_FLOAT :
+                                            (x & 0x38) == 0x18 ? TGL_PIPE_INT :
+                                            (x & 0x38) == 0x20 ? TGL_PIPE_LONG 
:
+                                            (x & 0x38) == 0x28 ? TGL_PIPE_MATH 
:
+                                            (x & 0x38) == 0x8 ? TGL_PIPE_ALL :
+                                            TGL_PIPE_NONE) };
+            return swsb;
+      }
+
    } else {
-      const struct tgl_swsb swsb = { x & 0x7u,
-                                     ((x & 0x78) == 0x10 ? TGL_PIPE_FLOAT :
-                                      (x & 0x78) == 0x18 ? TGL_PIPE_INT :
-                                      (x & 0x78) == 0x50 ? TGL_PIPE_LONG :
-                                      (x & 0x78) == 0x8 ? TGL_PIPE_ALL :
-                                      TGL_PIPE_NONE) };
-      assert(devinfo->verx10 >= 125 || swsb.pipe == TGL_PIPE_NONE);
-      return swsb;
+      if (x & 0x80) {
+         const struct tgl_swsb swsb = { (x & 0x70u) >> 4, TGL_PIPE_NONE,
+                                        x & 0xfu,
+                                        is_unordered ?
+                                        TGL_SBID_SET : TGL_SBID_DST };
+         return swsb;
+      } else if ((x & 0x70) == 0x20) {
+         return tgl_swsb_sbid(TGL_SBID_DST, x & 0xfu);
+      } else if ((x & 0x70) == 0x30) {
+         return tgl_swsb_sbid(TGL_SBID_SRC, x & 0xfu);
+      } else if ((x & 0x70) == 0x40) {
+         return tgl_swsb_sbid(TGL_SBID_SET, x & 0xfu);
+      } else {
+         const struct tgl_swsb swsb = { x & 0x7u,
+                                        ((x & 0x78) == 0x10 ? TGL_PIPE_FLOAT :
+                                         (x & 0x78) == 0x18 ? TGL_PIPE_INT :
+                                         (x & 0x78) == 0x50 ? TGL_PIPE_LONG :
+                                         (x & 0x78) == 0x8 ? TGL_PIPE_ALL :
+                                         TGL_PIPE_NONE) };
+         assert(devinfo->verx10 >= 125 || swsb.pipe == TGL_PIPE_NONE);
+         return swsb;
+      }
    }
 }
 

Reply via email to