| From b70e96ec44e2939ffee8c733e7b5f92fa0faf0b8 Mon Sep 17 00:00:00 2001 |
| From: Alex Deucher <alexander.deucher@amd.com> |
| Date: Thu, 17 Oct 2019 11:36:47 -0400 |
| Subject: [PATCH] drm/amdgpu/vce: fix allocation size in enc ring test |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit ee027828c40faa92a7ef4c2b0641bbb3f4be95d3 upstream. |
| |
| We need to allocate a large enough buffer for the |
| feedback buffer, otherwise the IB test can overwrite |
| other memory. |
| |
| Reviewed-by: James Zhu <James.Zhu@amd.com> |
| Acked-by: Christian Kรถnig <christian.koenig@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/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c |
| index f7189e22f6b7..db545182d4bb 100644 |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c |
| @@ -429,13 +429,14 @@ void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp) |
| * Open up a stream for HW test |
| */ |
| int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle, |
| + struct amdgpu_bo *bo, |
| struct dma_fence **fence) |
| { |
| const unsigned ib_size_dw = 1024; |
| 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); |
| @@ -444,7 +445,7 @@ int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle, |
| |
| ib = &job->ibs[0]; |
| |
| - dummy = ib->gpu_addr + 1024; |
| + addr = amdgpu_bo_gpu_offset(bo); |
| |
| /* stitch together an VCE create msg */ |
| ib->length_dw = 0; |
| @@ -476,8 +477,8 @@ int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle, |
| |
| ib->ptr[ib->length_dw++] = 0x00000014; /* len */ |
| ib->ptr[ib->length_dw++] = 0x05000005; /* feedback buffer */ |
| - 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++] = 0x00000001; |
| |
| for (i = ib->length_dw; i < ib_size_dw; ++i) |
| @@ -1110,13 +1111,20 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring) |
| int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout) |
| { |
| struct dma_fence *fence = NULL; |
| + struct amdgpu_bo *bo = NULL; |
| long r; |
| |
| /* skip vce ring1/2 ib test for now, since it's not reliable */ |
| if (ring != &ring->adev->vce.ring[0]) |
| return 0; |
| |
| - r = amdgpu_vce_get_create_msg(ring, 1, NULL); |
| + r = amdgpu_bo_create_reserved(ring->adev, 512, PAGE_SIZE, |
| + AMDGPU_GEM_DOMAIN_VRAM, |
| + &bo, NULL, NULL); |
| + if (r) |
| + return r; |
| + |
| + r = amdgpu_vce_get_create_msg(ring, 1, bo, NULL); |
| if (r) |
| goto error; |
| |
| @@ -1132,5 +1140,7 @@ int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout) |
| |
| error: |
| dma_fence_put(fence); |
| + amdgpu_bo_unreserve(bo); |
| + amdgpu_bo_unref(&bo); |
| return r; |
| } |
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h |
| index 30ea54dd9117..e802f7d9db0a 100644 |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h |
| @@ -59,6 +59,7 @@ int amdgpu_vce_entity_init(struct amdgpu_device *adev); |
| int amdgpu_vce_suspend(struct amdgpu_device *adev); |
| int amdgpu_vce_resume(struct amdgpu_device *adev); |
| int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle, |
| + struct amdgpu_bo *bo, |
| struct dma_fence **fence); |
| int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, |
| bool direct, struct dma_fence **fence); |
| -- |
| 2.7.4 |
| |