diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4611-drm-amdgpu-add-vcn-jpeg-ib-test.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4611-drm-amdgpu-add-vcn-jpeg-ib-test.patch | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4611-drm-amdgpu-add-vcn-jpeg-ib-test.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4611-drm-amdgpu-add-vcn-jpeg-ib-test.patch new file mode 100644 index 00000000..18e86cd7 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4611-drm-amdgpu-add-vcn-jpeg-ib-test.patch @@ -0,0 +1,139 @@ +From bd4990c746a7060fab8bdf177fa942b6796a1685 Mon Sep 17 00:00:00 2001 +From: Boyuan Zhang <boyuan.zhang@amd.com> +Date: Wed, 30 May 2018 15:56:43 -0400 +Subject: [PATCH 4611/5725] drm/amdgpu: add vcn jpeg ib test +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add an ib test for vcn jpeg. + +Signed-off-by: Boyuan Zhang <boyuan.zhang@amd.com> +Reviewed-by: Christian König <christian.koenig@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 86 +++++++++++++++++++++++++++++++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h | 1 + + drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 2 +- + 3 files changed, 88 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +index 5bacf80..7ea85c9 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +@@ -623,3 +623,89 @@ int amdgpu_vcn_jpeg_ring_test_ring(struct amdgpu_ring *ring) + + return r; + } ++ ++static int amdgpu_vcn_jpeg_set_reg(struct amdgpu_ring *ring, uint32_t handle, ++ struct dma_fence **fence) ++{ ++ struct amdgpu_device *adev = ring->adev; ++ struct amdgpu_job *job; ++ struct amdgpu_ib *ib; ++ struct dma_fence *f = NULL; ++ const unsigned ib_size_dw = 16; ++ int i, r; ++ ++ r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); ++ if (r) ++ return r; ++ ++ ib = &job->ibs[0]; ++ ++ ib->ptr[0] = PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_PITCH), 0, 0, PACKETJ_TYPE0); ++ ib->ptr[1] = 0xDEADBEEF; ++ for (i = 2; i < 16; i += 2) { ++ ib->ptr[i] = PACKETJ(0, 0, 0, PACKETJ_TYPE6); ++ ib->ptr[i+1] = 0; ++ } ++ ib->length_dw = 16; ++ ++ r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); ++ job->fence = dma_fence_get(f); ++ if (r) ++ goto err; ++ ++ amdgpu_job_free(job); ++ if (fence) ++ *fence = dma_fence_get(f); ++ dma_fence_put(f); ++ ++ return 0; ++ ++err: ++ amdgpu_job_free(job); ++ return r; ++} ++ ++int amdgpu_vcn_jpeg_ring_test_ib(struct amdgpu_ring *ring, long timeout) ++{ ++ struct amdgpu_device *adev = ring->adev; ++ uint32_t tmp = 0; ++ unsigned i; ++ struct dma_fence *fence = NULL; ++ long r = 0; ++ ++ r = amdgpu_vcn_jpeg_set_reg(ring, 1, &fence); ++ if (r) { ++ DRM_ERROR("amdgpu: failed to set jpeg register (%ld).\n", r); ++ goto error; ++ } ++ ++ r = dma_fence_wait_timeout(fence, false, timeout); ++ if (r == 0) { ++ DRM_ERROR("amdgpu: IB test timed out.\n"); ++ r = -ETIMEDOUT; ++ goto error; ++ } else if (r < 0) { ++ DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r); ++ goto error; ++ } else ++ r = 0; ++ ++ for (i = 0; i < adev->usec_timeout; i++) { ++ tmp = RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_PITCH)); ++ if (tmp == 0xDEADBEEF) ++ break; ++ DRM_UDELAY(1); ++ } ++ ++ if (i < adev->usec_timeout) ++ DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx); ++ else { ++ DRM_ERROR("ib test failed (0x%08X)\n", tmp); ++ r = -EINVAL; ++ } ++ ++ dma_fence_put(fence); ++ ++error: ++ return r; ++} +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h +index 0447fae..0b0b863 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h +@@ -85,5 +85,6 @@ int amdgpu_vcn_enc_ring_test_ring(struct amdgpu_ring *ring); + int amdgpu_vcn_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout); + + int amdgpu_vcn_jpeg_ring_test_ring(struct amdgpu_ring *ring); ++int amdgpu_vcn_jpeg_ring_test_ib(struct amdgpu_ring *ring, long timeout); + + #endif +diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +index 3d58236..d0c428f 100644 +--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +@@ -1751,7 +1751,7 @@ static const struct amdgpu_ring_funcs vcn_v1_0_jpeg_ring_vm_funcs = { + .emit_fence = vcn_v1_0_jpeg_ring_emit_fence, + .emit_vm_flush = vcn_v1_0_jpeg_ring_emit_vm_flush, + .test_ring = amdgpu_vcn_jpeg_ring_test_ring, +- //.test_ib ++ .test_ib = amdgpu_vcn_jpeg_ring_test_ib, + .insert_nop = vcn_v1_0_jpeg_ring_nop, + .insert_start = vcn_v1_0_jpeg_ring_insert_start, + .insert_end = vcn_v1_0_jpeg_ring_insert_end, +-- +2.7.4 + |