Mesa (main): radv: add an SQTT workaround for chips with disabled RBs

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Apr 25 23:20:53 UTC 2022


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

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Mon Apr 25 09:46:08 2022 +0200

radv: add an SQTT workaround for chips with disabled RBs

Ported from RadeonSI.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16133>

---

 src/amd/vulkan/radv_sqtt.c | 57 ++++++++++++++++++++++++++--------------------
 1 file changed, 32 insertions(+), 25 deletions(-)

diff --git a/src/amd/vulkan/radv_sqtt.c b/src/amd/vulkan/radv_sqtt.c
index 34e7c45576d..9a89ef65e94 100644
--- a/src/amd/vulkan/radv_sqtt.c
+++ b/src/amd/vulkan/radv_sqtt.c
@@ -57,6 +57,21 @@ gfx10_get_thread_trace_ctrl(struct radv_device *device, bool enable)
    return thread_trace_ctrl;
 }
 
+static void
+radv_emit_wait_for_idle(struct radv_device *device, struct radeon_cmdbuf *cs, int family)
+{
+   enum rgp_flush_bits sqtt_flush_bits = 0;
+   si_cs_emit_cache_flush(
+      cs, device->physical_device->rad_info.chip_class, NULL, 0,
+      family == RING_COMPUTE && device->physical_device->rad_info.chip_class >= GFX7,
+      (family == RADV_QUEUE_COMPUTE
+          ? RADV_CMD_FLAG_CS_PARTIAL_FLUSH
+          : (RADV_CMD_FLAG_CS_PARTIAL_FLUSH | RADV_CMD_FLAG_PS_PARTIAL_FLUSH)) |
+         RADV_CMD_FLAG_INV_ICACHE | RADV_CMD_FLAG_INV_SCACHE | RADV_CMD_FLAG_INV_VCACHE |
+         RADV_CMD_FLAG_INV_L2,
+      &sqtt_flush_bits, 0);
+}
+
 static void
 radv_emit_thread_trace_start(struct radv_device *device, struct radeon_cmdbuf *cs,
                              enum radv_queue_family qf)
@@ -251,6 +266,11 @@ radv_emit_thread_trace_stop(struct radv_device *device, struct radeon_cmdbuf *cs
    radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 0, 0));
    radeon_emit(cs, EVENT_TYPE(V_028A90_THREAD_TRACE_FINISH) | EVENT_INDEX(0));
 
+   if (device->physical_device->rad_info.has_sqtt_rb_harvest_bug) {
+      /* Some chips with disabled RBs should wait for idle because FINISH_DONE doesn't work. */
+      radv_emit_wait_for_idle(device, cs, qf);
+   }
+
    for (unsigned se = 0; se < max_se; se++) {
       if (radv_se_is_disabled(device, se))
          continue;
@@ -261,16 +281,18 @@ radv_emit_thread_trace_stop(struct radv_device *device, struct radeon_cmdbuf *cs
          S_030800_SE_INDEX(se) | S_030800_SH_INDEX(0) | S_030800_INSTANCE_BROADCAST_WRITES(1));
 
       if (device->physical_device->rad_info.chip_class >= GFX10) {
-         /* Make sure to wait for the trace buffer. */
-         radeon_emit(cs, PKT3(PKT3_WAIT_REG_MEM, 5, 0));
-         radeon_emit(
-            cs,
-            WAIT_REG_MEM_NOT_EQUAL); /* wait until the register is equal to the reference value */
-         radeon_emit(cs, R_008D20_SQ_THREAD_TRACE_STATUS >> 2); /* register */
-         radeon_emit(cs, 0);
-         radeon_emit(cs, 0);                       /* reference value */
-         radeon_emit(cs, ~C_008D20_FINISH_DONE);
-         radeon_emit(cs, 4);                       /* poll interval */
+         if (!device->physical_device->rad_info.has_sqtt_rb_harvest_bug) {
+            /* Make sure to wait for the trace buffer. */
+            radeon_emit(cs, PKT3(PKT3_WAIT_REG_MEM, 5, 0));
+            radeon_emit(
+               cs,
+               WAIT_REG_MEM_NOT_EQUAL); /* wait until the register is equal to the reference value */
+            radeon_emit(cs, R_008D20_SQ_THREAD_TRACE_STATUS >> 2); /* register */
+            radeon_emit(cs, 0);
+            radeon_emit(cs, 0);                       /* reference value */
+            radeon_emit(cs, ~C_008D20_FINISH_DONE);
+            radeon_emit(cs, 4);                       /* poll interval */
+         }
 
          /* Disable the thread trace mode. */
          radeon_set_privileged_config_reg(cs, R_008D1C_SQ_THREAD_TRACE_CTRL,
@@ -365,21 +387,6 @@ radv_emit_inhibit_clockgating(struct radv_device *device, struct radeon_cmdbuf *
    }
 }
 
-static void
-radv_emit_wait_for_idle(struct radv_device *device, struct radeon_cmdbuf *cs, int family)
-{
-   enum rgp_flush_bits sqtt_flush_bits = 0;
-   si_cs_emit_cache_flush(
-      cs, device->physical_device->rad_info.chip_class, NULL, 0,
-      family == RING_COMPUTE && device->physical_device->rad_info.chip_class >= GFX7,
-      (family == RADV_QUEUE_COMPUTE
-          ? RADV_CMD_FLAG_CS_PARTIAL_FLUSH
-          : (RADV_CMD_FLAG_CS_PARTIAL_FLUSH | RADV_CMD_FLAG_PS_PARTIAL_FLUSH)) |
-         RADV_CMD_FLAG_INV_ICACHE | RADV_CMD_FLAG_INV_SCACHE | RADV_CMD_FLAG_INV_VCACHE |
-         RADV_CMD_FLAG_INV_L2,
-      &sqtt_flush_bits, 0);
-}
-
 static bool
 radv_thread_trace_init_bo(struct radv_device *device)
 {



More information about the mesa-commit mailing list