| From 6363166d2077745f6e391d6cfd440c65c07bcecb Mon Sep 17 00:00:00 2001 |
| From: Alex Deucher <alexander.deucher@amd.com> |
| Date: Tue, 15 Oct 2019 18:08:59 -0400 |
| Subject: [PATCH] drm/amdgpu/uvd7: fix allocation size in enc ring test (v2) |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit 5d230bc91f6c15e5d281f2851502918d98b9e770 upstream. |
| |
| We need to allocate a large enough buffer for the |
| session info, otherwise the IB test can overwrite |
| other memory. |
| |
| v2: - session info is 128K according to mesa |
| - use the same session info for create and destroy |
| |
| Bug: https://bugzilla.kernel.org/show_bug.cgi?id=204241 |
| Acked-by: Christian Kรถnig <christian.koenig@amd.com> |
| Reviewed-by: James Zhu <James.Zhu@amd.com> |
| Tested-by: James Zhu <James.Zhu@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c |
| index fc4f0bb9a2e7..4bafd1687138 100644 |
| --- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c |
| @@ -214,13 +214,14 @@ static int uvd_v7_0_enc_ring_test_ring(struct amdgpu_ring *ring) |
| * Open up a stream for HW test |
| */ |
| static int uvd_v7_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handle, |
| + struct amdgpu_bo *bo, |
| struct dma_fence **fence) |
| { |
| const unsigned ib_size_dw = 16; |
| struct amdgpu_job *job; |
| struct amdgpu_ib *ib; |
| struct dma_fence *f = NULL; |
| - uint64_t dummy; |
| + uint64_t addr; |
| int i, r; |
| |
| r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); |
| @@ -228,15 +229,15 @@ static int uvd_v7_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handle |
| return r; |
| |
| ib = &job->ibs[0]; |
| - dummy = ib->gpu_addr + 1024; |
| + addr = amdgpu_bo_gpu_offset(bo); |
| |
| ib->length_dw = 0; |
| ib->ptr[ib->length_dw++] = 0x00000018; |
| ib->ptr[ib->length_dw++] = 0x00000001; /* session info */ |
| ib->ptr[ib->length_dw++] = handle; |
| ib->ptr[ib->length_dw++] = 0x00000000; |
| - ib->ptr[ib->length_dw++] = upper_32_bits(dummy); |
| - ib->ptr[ib->length_dw++] = dummy; |
| + ib->ptr[ib->length_dw++] = upper_32_bits(addr); |
| + ib->ptr[ib->length_dw++] = addr; |
| |
| ib->ptr[ib->length_dw++] = 0x00000014; |
| ib->ptr[ib->length_dw++] = 0x00000002; /* task info */ |
| @@ -275,13 +276,14 @@ static int uvd_v7_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handle |
| * Close up a stream for HW test or if userspace failed to do so |
| */ |
| static int uvd_v7_0_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, |
| - struct dma_fence **fence) |
| + struct amdgpu_bo *bo, |
| + struct dma_fence **fence) |
| { |
| const unsigned ib_size_dw = 16; |
| struct amdgpu_job *job; |
| struct amdgpu_ib *ib; |
| struct dma_fence *f = NULL; |
| - uint64_t dummy; |
| + uint64_t addr; |
| int i, r; |
| |
| r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); |
| @@ -289,15 +291,15 @@ static int uvd_v7_0_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handl |
| return r; |
| |
| ib = &job->ibs[0]; |
| - dummy = ib->gpu_addr + 1024; |
| + addr = amdgpu_bo_gpu_offset(bo); |
| |
| ib->length_dw = 0; |
| ib->ptr[ib->length_dw++] = 0x00000018; |
| ib->ptr[ib->length_dw++] = 0x00000001; |
| ib->ptr[ib->length_dw++] = handle; |
| ib->ptr[ib->length_dw++] = 0x00000000; |
| - ib->ptr[ib->length_dw++] = upper_32_bits(dummy); |
| - ib->ptr[ib->length_dw++] = dummy; |
| + ib->ptr[ib->length_dw++] = upper_32_bits(addr); |
| + ib->ptr[ib->length_dw++] = addr; |
| |
| ib->ptr[ib->length_dw++] = 0x00000014; |
| ib->ptr[ib->length_dw++] = 0x00000002; |
| @@ -334,13 +336,20 @@ static int uvd_v7_0_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handl |
| static int uvd_v7_0_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout) |
| { |
| struct dma_fence *fence = NULL; |
| + struct amdgpu_bo *bo = NULL; |
| long r; |
| |
| - r = uvd_v7_0_enc_get_create_msg(ring, 1, NULL); |
| + r = amdgpu_bo_create_reserved(ring->adev, 128 * 1024, PAGE_SIZE, |
| + AMDGPU_GEM_DOMAIN_VRAM, |
| + &bo, NULL, NULL); |
| + if (r) |
| + return r; |
| + |
| + r = uvd_v7_0_enc_get_create_msg(ring, 1, bo, NULL); |
| if (r) |
| goto error; |
| |
| - r = uvd_v7_0_enc_get_destroy_msg(ring, 1, &fence); |
| + r = uvd_v7_0_enc_get_destroy_msg(ring, 1, bo, &fence); |
| if (r) |
| goto error; |
| |
| @@ -352,6 +361,8 @@ static int uvd_v7_0_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout) |
| |
| error: |
| dma_fence_put(fence); |
| + amdgpu_bo_unreserve(bo); |
| + amdgpu_bo_unref(&bo); |
| return r; |
| } |
| |
| -- |
| 2.7.4 |
| |