radeonsi: enable larger SDMA clears and copies on gfx10.3
authorMarek Olšák <marek.olsak@amd.com>
Tue, 3 Sep 2019 21:54:47 +0000 (17:54 -0400)
committerMarge Bot <eric+marge@anholt.net>
Tue, 9 Jun 2020 16:17:36 +0000 (16:17 +0000)
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5383>

src/amd/common/sid.h
src/gallium/drivers/radeonsi/si_dma_cs.c

index 1f54f94ae7b7f2f106eac838dda6d278ce53baba..d77d2ff57509a39633e5f9d513eda3bdc73cdbd3 100644 (file)
 #define        SDMA_TS_SUB_OPCODE_GET_LOCAL_TIMESTAMP     0x1
 #define        SDMA_TS_SUB_OPCODE_GET_GLOBAL_TIMESTAMP    0x2
 #define    CIK_SDMA_PACKET_SRBM_WRITE              0xe
-/* There is apparently an undocumented HW "feature" that
-   prevents the HW from copying past 256 bytes of (1 << 22) */
-#define    CIK_SDMA_COPY_MAX_SIZE                  0x3fff00
+/* There is apparently an undocumented HW limitation that
+   prevents the HW from copying the last 255 bytes of (1 << 22) - 1 */
+#define    CIK_SDMA_COPY_MAX_SIZE                  0x3fff00  /* almost 4 MB*/
+#define    GFX103_SDMA_COPY_MAX_SIZE               0x3fffff00 /* almost 1 GB */
 
 enum amd_cmp_class_flags {
        S_NAN = 1 << 0,        // Signaling NaN
index 195cc6468fca2019f64c94d89234eca5041929cf..593bc0bad187e5b45981b3120044314b26a33cd0 100644 (file)
@@ -103,13 +103,16 @@ void si_sdma_clear_buffer(struct si_context *sctx, struct pipe_resource *dst, ui
       return;
    }
 
-   /* The following code is for Sea Islands and later. */
+   /* The following code is for CI and later. */
    /* the same maximum size as for copying */
-   ncopy = DIV_ROUND_UP(size, CIK_SDMA_COPY_MAX_SIZE);
+   unsigned max_size_per_packet = sctx->chip_class >= GFX10_3 ?
+                                     GFX103_SDMA_COPY_MAX_SIZE :
+                                     CIK_SDMA_COPY_MAX_SIZE;
+   ncopy = DIV_ROUND_UP(size, max_size_per_packet);
    si_need_dma_space(sctx, ncopy * 5, sdst, NULL);
 
    for (i = 0; i < ncopy; i++) {
-      csize = MIN2(size, CIK_SDMA_COPY_MAX_SIZE);
+      csize = MIN2(size, max_size_per_packet);
       radeon_emit(cs, CIK_SDMA_PACKET(CIK_SDMA_PACKET_CONSTANT_FILL, 0, 0x8000 /* dword copy */));
       radeon_emit(cs, offset);
       radeon_emit(cs, offset >> 32);
@@ -176,8 +179,11 @@ void si_sdma_copy_buffer(struct si_context *sctx, struct pipe_resource *dst,
    }
 
    /* The following code is for CI and later. */
+   unsigned max_size_per_packet = sctx->chip_class >= GFX10_3 ?
+                                     GFX103_SDMA_COPY_MAX_SIZE :
+                                     CIK_SDMA_COPY_MAX_SIZE;
    unsigned align = ~0u;
-   ncopy = DIV_ROUND_UP(size, CIK_SDMA_COPY_MAX_SIZE);
+   ncopy = DIV_ROUND_UP(size, max_size_per_packet);
 
    /* Align copy size to dw if src/dst address are dw aligned */
    if ((src_offset & 0x3) == 0 && (dst_offset & 0x3) == 0 && size > 4 && (size & 3) != 0) {
@@ -188,7 +194,7 @@ void si_sdma_copy_buffer(struct si_context *sctx, struct pipe_resource *dst,
    si_need_dma_space(sctx, ncopy * 7, sdst, ssrc);
 
    for (i = 0; i < ncopy; i++) {
-      csize = size >= 4 ? MIN2(size & align, CIK_SDMA_COPY_MAX_SIZE) : size;
+      csize = size >= 4 ? MIN2(size & align, max_size_per_packet) : size;
       radeon_emit(cs, CIK_SDMA_PACKET(CIK_SDMA_OPCODE_COPY, CIK_SDMA_COPY_SUB_OPCODE_LINEAR,
                                       (sctx->ws->cs_is_secure(cs) ? 1u : 0) << 2));
       radeon_emit(cs, sctx->chip_class >= GFX9 ? csize - 1 : csize);