drm/amdgpu: use max_dw in ring_init
authorChristian König <christian.koenig@amd.com>
Tue, 12 Apr 2016 14:26:34 +0000 (16:26 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 5 May 2016 00:20:50 +0000 (20:20 -0400)
Instead of specifying the total ring size calculate that from the maximum
number of dw a submission can have and the number of concurrent submissions.

This fixes UVD with 8 concurrent submissions or more.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
drivers/gpu/drm/amd/amdgpu/cik_sdma.c
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
drivers/gpu/drm/amd/amdgpu/vce_v3_0.c

index 7bd31ae10b33fd4c002d74b7fe8954e8324ea2bf..a91eca40e9b80072cd0c06d2193eb80f4f23ca7c 100644 (file)
@@ -215,18 +215,17 @@ int amdgpu_ring_restore(struct amdgpu_ring *ring,
  *
  * @adev: amdgpu_device pointer
  * @ring: amdgpu_ring structure holding ring information
- * @ring_size: size of the ring
+ * @max_ndw: maximum number of dw for ring alloc
  * @nop: nop packet for this ring
  *
  * Initialize the driver information for the selected ring (all asics).
  * Returns 0 on success, error on failure.
  */
 int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
-                    unsigned ring_size, u32 nop, u32 align_mask,
+                    unsigned max_dw, u32 nop, u32 align_mask,
                     struct amdgpu_irq_src *irq_src, unsigned irq_type,
                     enum amdgpu_ring_type ring_type)
 {
-       u32 rb_bufsz;
        int r;
 
        if (ring->adev == NULL) {
@@ -283,10 +282,8 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
                return r;
        }
 
-       /* Align ring size */
-       rb_bufsz = order_base_2(ring_size / 8);
-       ring_size = (1 << (rb_bufsz + 1)) * 4;
-       ring->ring_size = ring_size;
+       ring->ring_size = roundup_pow_of_two(max_dw * 4 *
+                                            amdgpu_sched_hw_submission);
        ring->align_mask = align_mask;
        ring->nop = nop;
        ring->type = ring_type;
@@ -319,8 +316,7 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
                }
        }
        ring->ptr_mask = (ring->ring_size / 4) - 1;
-       ring->max_dw = DIV_ROUND_UP(ring->ring_size / 4,
-                                   amdgpu_sched_hw_submission);
+       ring->max_dw = max_dw;
 
        if (amdgpu_debugfs_ring_init(adev, ring)) {
                DRM_ERROR("Failed to register debugfs file for rings !\n");
index d3ac3298fba8bafb77bb333f1056f4d449ed404a..b9a6070da1ef4a9f4d3893912cc15887015b9c81 100644 (file)
@@ -976,7 +976,7 @@ static int cik_sdma_sw_init(void *handle)
                ring = &adev->sdma.instance[i].ring;
                ring->ring_obj = NULL;
                sprintf(ring->name, "sdma%d", i);
-               r = amdgpu_ring_init(adev, ring, 256 * 1024,
+               r = amdgpu_ring_init(adev, ring, 32 * 1024,
                                     SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0), 0xf,
                                     &adev->sdma.trap_irq,
                                     (i == 0) ?
index bb8709066fd8707338663b119f4c7c62f8662716..ff99816fb2a85b32ce706f2a79a5d8199c2b1e6f 100644 (file)
@@ -4414,7 +4414,7 @@ static int gfx_v7_0_sw_init(void *handle)
                ring = &adev->gfx.gfx_ring[i];
                ring->ring_obj = NULL;
                sprintf(ring->name, "gfx");
-               r = amdgpu_ring_init(adev, ring, 1024 * 1024,
+               r = amdgpu_ring_init(adev, ring, 128 * 1024,
                                     PACKET3(PACKET3_NOP, 0x3FFF), 0xf,
                                     &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP,
                                     AMDGPU_RING_TYPE_GFX);
@@ -4441,7 +4441,7 @@ static int gfx_v7_0_sw_init(void *handle)
                sprintf(ring->name, "comp %d.%d.%d", ring->me, ring->pipe, ring->queue);
                irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe;
                /* type-2 packets are deprecated on MEC, use type-3 instead */
-               r = amdgpu_ring_init(adev, ring, 1024 * 1024,
+               r = amdgpu_ring_init(adev, ring, 128 * 1024,
                                     PACKET3(PACKET3_NOP, 0x3FFF), 0xf,
                                     &adev->gfx.eop_irq, irq_type,
                                     AMDGPU_RING_TYPE_COMPUTE);
index f0c7b3596480995afca643caa42a93827c04f841..904f0be06a4ff5354f317983e6fdcbf701f463e2 100644 (file)
@@ -1570,7 +1570,7 @@ static int gfx_v8_0_sw_init(void *handle)
                        ring->doorbell_index = AMDGPU_DOORBELL_GFX_RING0;
                }
 
-               r = amdgpu_ring_init(adev, ring, 1024 * 1024,
+               r = amdgpu_ring_init(adev, ring, 128 * 1024,
                                     PACKET3(PACKET3_NOP, 0x3FFF), 0xf,
                                     &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP,
                                     AMDGPU_RING_TYPE_GFX);
@@ -1597,7 +1597,7 @@ static int gfx_v8_0_sw_init(void *handle)
                sprintf(ring->name, "comp %d.%d.%d", ring->me, ring->pipe, ring->queue);
                irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe;
                /* type-2 packets are deprecated on MEC, use type-3 instead */
-               r = amdgpu_ring_init(adev, ring, 1024 * 1024,
+               r = amdgpu_ring_init(adev, ring, 128 * 1024,
                                     PACKET3(PACKET3_NOP, 0x3FFF), 0xf,
                                     &adev->gfx.eop_irq, irq_type,
                                     AMDGPU_RING_TYPE_COMPUTE);
index 6e0a86a563f3e8d35e7bf907bdaaa845aca5d55c..0f1282790c43364c739dfc9d5ca803fdc7014b76 100644 (file)
@@ -990,7 +990,7 @@ static int sdma_v2_4_sw_init(void *handle)
                ring->ring_obj = NULL;
                ring->use_doorbell = false;
                sprintf(ring->name, "sdma%d", i);
-               r = amdgpu_ring_init(adev, ring, 256 * 1024,
+               r = amdgpu_ring_init(adev, ring, 32 * 1024,
                                     SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 0xf,
                                     &adev->sdma.trap_irq,
                                     (i == 0) ?
index 0d6b9e2150ccff5077b3d0238955bd0461e6fb65..c257cfae61c07f32df0eccee12930ad73de75ec2 100644 (file)
@@ -114,7 +114,7 @@ static int uvd_v4_2_sw_init(void *handle)
 
        ring = &adev->uvd.ring;
        sprintf(ring->name, "uvd");
-       r = amdgpu_ring_init(adev, ring, 4096, CP_PACKET2, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, CP_PACKET2, 0xf,
                             &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD);
 
        return r;
index 84abf89ef4f88ae519da13e7d270b0e0cfb41d1a..5f0d4f76e228d2d926d4b9b5e9c17549386f9bda 100644 (file)
@@ -111,7 +111,7 @@ static int uvd_v5_0_sw_init(void *handle)
 
        ring = &adev->uvd.ring;
        sprintf(ring->name, "uvd");
-       r = amdgpu_ring_init(adev, ring, 4096, CP_PACKET2, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, CP_PACKET2, 0xf,
                             &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD);
 
        return r;
index c633b1a26a7e2c10a4308ba9862b5ef3cb0c9bcb..7e7c3dad4c84aeed64761ba065d752763c09963e 100644 (file)
@@ -112,7 +112,7 @@ static int uvd_v6_0_sw_init(void *handle)
 
        ring = &adev->uvd.ring;
        sprintf(ring->name, "uvd");
-       r = amdgpu_ring_init(adev, ring, 4096, CP_PACKET2, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, CP_PACKET2, 0xf,
                             &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD);
 
        return r;
index c306cb943e5f2827c012e51590cd08b647e24756..ab9ee2ad5f86a750032149961aa28c3c51b24bca 100644 (file)
@@ -201,14 +201,14 @@ static int vce_v2_0_sw_init(void *handle)
 
        ring = &adev->vce.ring[0];
        sprintf(ring->name, "vce0");
-       r = amdgpu_ring_init(adev, ring, 4096, VCE_CMD_NO_OP, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf,
                             &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE);
        if (r)
                return r;
 
        ring = &adev->vce.ring[1];
        sprintf(ring->name, "vce1");
-       r = amdgpu_ring_init(adev, ring, 4096, VCE_CMD_NO_OP, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf,
                             &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE);
        if (r)
                return r;
index ce468ee5da2a769b755438700922d371ad592eeb..bf7bc842c6ed7d743a5ef97ab91c3ff73a90ca8a 100644 (file)
@@ -381,14 +381,14 @@ static int vce_v3_0_sw_init(void *handle)
 
        ring = &adev->vce.ring[0];
        sprintf(ring->name, "vce0");
-       r = amdgpu_ring_init(adev, ring, 4096, VCE_CMD_NO_OP, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf,
                             &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE);
        if (r)
                return r;
 
        ring = &adev->vce.ring[1];
        sprintf(ring->name, "vce1");
-       r = amdgpu_ring_init(adev, ring, 4096, VCE_CMD_NO_OP, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf,
                             &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE);
        if (r)
                return r;