diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0481-drm-amdgpu-use-max_dw-in-ring_init.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0481-drm-amdgpu-use-max_dw-in-ring_init.patch | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0481-drm-amdgpu-use-max_dw-in-ring_init.patch b/common/recipes-kernel/linux/files/0481-drm-amdgpu-use-max_dw-in-ring_init.patch new file mode 100644 index 00000000..56c731e4 --- /dev/null +++ b/common/recipes-kernel/linux/files/0481-drm-amdgpu-use-max_dw-in-ring_init.patch @@ -0,0 +1,231 @@ +From 1e23c826e9bd76db7279a457a9a4051c9937baee Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Tue, 12 Apr 2016 16:26:34 +0200 +Subject: [PATCH 0481/1110] drm/amdgpu: use max_dw in ring_init +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +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 | 14 +++++--------- + drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 2 +- + drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 4 ++-- + drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 4 ++-- + drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | 2 +- + drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c | 2 +- + drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c | 2 +- + drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 2 +- + drivers/gpu/drm/amd/amdgpu/vce_v2_0.c | 4 ++-- + drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 4 ++-- + 10 files changed, 18 insertions(+), 22 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +index 7bd31ae..a91eca4 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +@@ -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"); +diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +index dd0cc1b..2a1e83f 100644 +--- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c ++++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +@@ -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) ? +diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +index 177eb78..967150c 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +@@ -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); +diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +index 066f349..9839d4e 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +@@ -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); +diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c +index 96b63d9..82dc1e5 100644 +--- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c ++++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c +@@ -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) ? +diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c +index 0d6b9e2..c257cfa 100644 +--- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c ++++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c +@@ -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; +diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c +index 84abf89..5f0d4f7 100644 +--- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c +@@ -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; +diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +index c633b1a..7e7c3da 100644 +--- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +@@ -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; +diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c +index c306cb9..ab9ee2a 100644 +--- a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c +@@ -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; +diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c +index ce468ee..bf7bc84 100644 +--- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c +@@ -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; +-- +2.7.4 + |