aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4611-drm-amdgpu-add-vcn-jpeg-ib-test.patch
diff options
context:
space:
mode:
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.patch139
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
+