radeonsi: always use PFP_SYNC_ME when doing flushes and waits
authorMarek Olšák <marek.olsak@amd.com>
Sun, 17 Apr 2016 15:28:25 +0000 (17:28 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 18 Apr 2016 17:51:25 +0000 (19:51 +0200)
This is typically used by the closed driver before SURFACE_SYNC.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_state_draw.c
src/gallium/drivers/radeonsi/sid.h

index 3efaecc5e618634595adcfcd73e3040bcba89701..d31f77f98495c15270b7db728d1fcba1770ff5b9 100644 (file)
@@ -706,8 +706,16 @@ void si_emit_cache_flush(struct si_context *si_ctx, struct r600_atom *atom)
                radeon_emit(cs, EVENT_TYPE(V_028A90_VGT_STREAMOUT_SYNC) | EVENT_INDEX(0));
        }
 
+       /* Make sure ME is idle (it executes most packets) before continuing.
+        * This prevents read-after-write hazards between PFP and ME.
+        */
+       if (cp_coher_cntl || (sctx->flags & SI_CONTEXT_CS_PARTIAL_FLUSH)) {
+               radeon_emit(cs, PKT3(PKT3_PFP_SYNC_ME, 0, 0));
+               radeon_emit(cs, 0);
+       }
+
        /* When one of the DEST_BASE flags is set, SURFACE_SYNC waits for idle.
-        * Therefore, it should be last.
+        * Therefore, it should be last. Done in PFP.
         */
        if (cp_coher_cntl) {
                /* ACQUIRE_MEM is only required on a compute ring. */
index f0aa605c2d91bde01e22c3552b96ddd3d7dceddd..11d6090317c4c75aac901116e371e8f7aa1f3f21 100644 (file)
 #define                COPY_DATA_DST_SEL(x)            (((x) & 0xf) << 8)
 #define                COPY_DATA_COUNT_SEL             (1 << 16)
 #define                COPY_DATA_WR_CONFIRM            (1 << 20)
+#define PKT3_PFP_SYNC_ME                      0x42 /* r7xx+ */
 #define PKT3_SURFACE_SYNC                      0x43 /* deprecated on CIK, use ACQUIRE_MEM */
 #define PKT3_ME_INITIALIZE                     0x44 /* not on CIK */
 #define PKT3_COND_WRITE                        0x45