[Mesa-dev] [PATCH 2/2] radeonsi: don't use the CP DMA workaround on Fiji and newer

Marek Olšák maraeo at gmail.com
Fri Dec 4 12:27:44 PST 2015


From: Marek Olšák <marek.olsak at amd.com>

---
 src/gallium/drivers/radeonsi/si_cp_dma.c | 36 ++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 16 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_cp_dma.c b/src/gallium/drivers/radeonsi/si_cp_dma.c
index 0bf85a0..a5e3d79 100644
--- a/src/gallium/drivers/radeonsi/si_cp_dma.c
+++ b/src/gallium/drivers/radeonsi/si_cp_dma.c
@@ -273,22 +273,26 @@ void si_copy_buffer(struct si_context *sctx,
 	dst_offset += r600_resource(dst)->gpu_address;
 	src_offset += r600_resource(src)->gpu_address;
 
-	/* If the size is not aligned, we must add a dummy copy at the end
-	 * just to align the internal counter. Otherwise, the DMA engine
-	 * would slow down by an order of magnitude for following copies.
-	 */
-	if (size % CP_DMA_ALIGNMENT)
-		realign_size = CP_DMA_ALIGNMENT - (size % CP_DMA_ALIGNMENT);
-
-	/* If the copy begins unaligned, we must start copying from the next
-	 * aligned block and the skipped part should be copied after everything
-	 * else has been copied. Only the src alignment matters, not dst.
-	 */
-	if (src_offset % CP_DMA_ALIGNMENT) {
-		skipped_size = CP_DMA_ALIGNMENT - (src_offset % CP_DMA_ALIGNMENT);
-		/* The main part will be skipped if the size is too small. */
-		skipped_size = MIN2(skipped_size, size);
-		size -= skipped_size;
+	/* The workarounds aren't needed on Fiji and beyond. */
+	if (sctx->b.family <= CHIP_CARRIZO ||
+	    sctx->b.family == CHIP_STONEY) {
+		/* If the size is not aligned, we must add a dummy copy at the end
+		 * just to align the internal counter. Otherwise, the DMA engine
+		 * would slow down by an order of magnitude for following copies.
+		 */
+		if (size % CP_DMA_ALIGNMENT)
+			realign_size = CP_DMA_ALIGNMENT - (size % CP_DMA_ALIGNMENT);
+
+		/* If the copy begins unaligned, we must start copying from the next
+		 * aligned block and the skipped part should be copied after everything
+		 * else has been copied. Only the src alignment matters, not dst.
+		 */
+		if (src_offset % CP_DMA_ALIGNMENT) {
+			skipped_size = CP_DMA_ALIGNMENT - (src_offset % CP_DMA_ALIGNMENT);
+			/* The main part will be skipped if the size is too small. */
+			skipped_size = MIN2(skipped_size, size);
+			size -= skipped_size;
+		}
 	}
 
 	/* Flush the caches. */
-- 
2.1.4



More information about the mesa-dev mailing list