aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1952-drm-amdgpu-add-uvd-enc-ring-test.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1952-drm-amdgpu-add-uvd-enc-ring-test.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1952-drm-amdgpu-add-uvd-enc-ring-test.patch108
1 files changed, 108 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1952-drm-amdgpu-add-uvd-enc-ring-test.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1952-drm-amdgpu-add-uvd-enc-ring-test.patch
new file mode 100644
index 00000000..aaf27dfa
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1952-drm-amdgpu-add-uvd-enc-ring-test.patch
@@ -0,0 +1,108 @@
+From b8fa98eeec3868c0e3cf5d15fa25be9e3a0288bb Mon Sep 17 00:00:00 2001
+From: James Zhu <James.Zhu@amd.com>
+Date: Fri, 29 Sep 2017 16:40:12 -0400
+Subject: [PATCH 1952/4131] drm/amdgpu: add uvd enc ring test
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Add UVD encode ring test functions. And enable UVD encode ring test
+during UVD encode hardware initialization.
+
+Signed-off-by: James Zhu <James.Zhu@amd.com>
+Reviewed-and-Tested-by: Leo Liu <leo.liu@amd.com>
+Reviewed-by: Christian König <christian.koenig@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 55 ++++++++++++++++++++++++++++++++++-
+ 1 file changed, 54 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
+index 8b50441..996e671 100644
+--- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
+@@ -155,6 +155,46 @@ static void uvd_v6_0_enc_ring_set_wptr(struct amdgpu_ring *ring)
+ lower_32_bits(ring->wptr));
+ }
+
++/**
++ * uvd_v6_0_enc_ring_test_ring - test if UVD ENC ring is working
++ *
++ * @ring: the engine to test on
++ *
++ */
++static int uvd_v6_0_enc_ring_test_ring(struct amdgpu_ring *ring)
++{
++ struct amdgpu_device *adev = ring->adev;
++ uint32_t rptr = amdgpu_ring_get_rptr(ring);
++ unsigned i;
++ int r;
++
++ r = amdgpu_ring_alloc(ring, 16);
++ if (r) {
++ DRM_ERROR("amdgpu: uvd enc failed to lock ring %d (%d).\n",
++ ring->idx, r);
++ return r;
++ }
++ amdgpu_ring_write(ring, HEVC_ENC_CMD_END);
++ amdgpu_ring_commit(ring);
++
++ for (i = 0; i < adev->usec_timeout; i++) {
++ if (amdgpu_ring_get_rptr(ring) != rptr)
++ break;
++ DRM_UDELAY(1);
++ }
++
++ if (i < adev->usec_timeout) {
++ DRM_INFO("ring test on %d succeeded in %d usecs\n",
++ ring->idx, i);
++ } else {
++ DRM_ERROR("amdgpu: ring %d test failed\n",
++ ring->idx);
++ r = -ETIMEDOUT;
++ }
++
++ return r;
++}
++
+ static int uvd_v6_0_early_init(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+@@ -256,7 +296,7 @@ static int uvd_v6_0_hw_init(void *handle)
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+ struct amdgpu_ring *ring = &adev->uvd.ring;
+ uint32_t tmp;
+- int r;
++ int i, r;
+
+ amdgpu_asic_set_uvd_clocks(adev, 10000, 10000);
+ uvd_v6_0_set_clockgating_state(adev, AMD_CG_STATE_UNGATE);
+@@ -296,6 +336,18 @@ static int uvd_v6_0_hw_init(void *handle)
+
+ amdgpu_ring_commit(ring);
+
++ if (uvd_v6_0_enc_support(adev)) {
++ for (i = 0; i < adev->uvd.num_enc_rings; ++i) {
++ ring = &adev->uvd.ring_enc[i];
++ ring->ready = true;
++ r = amdgpu_ring_test_ring(ring);
++ if (r) {
++ ring->ready = false;
++ goto done;
++ }
++ }
++ }
++
+ done:
+ if (!r)
+ if (uvd_v6_0_enc_support(adev))
+@@ -1356,6 +1408,7 @@ static const struct amdgpu_ring_funcs uvd_v6_0_enc_ring_vm_funcs = {
+ .emit_fence = uvd_v6_0_enc_ring_emit_fence,
+ .emit_vm_flush = uvd_v6_0_enc_ring_emit_vm_flush,
+ .emit_pipeline_sync = uvd_v6_0_enc_ring_emit_pipeline_sync,
++ .test_ring = uvd_v6_0_enc_ring_test_ring,
+ .insert_nop = amdgpu_ring_insert_nop,
+ .insert_end = uvd_v6_0_enc_ring_insert_end,
+ .pad_ib = amdgpu_ring_generic_pad_ib,
+--
+2.7.4
+