aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0509-drm-amdgpu-stop-trying-to-suspend-UVD-sessions-v2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0509-drm-amdgpu-stop-trying-to-suspend-UVD-sessions-v2.patch')
-rw-r--r--common/recipes-kernel/linux/files/0509-drm-amdgpu-stop-trying-to-suspend-UVD-sessions-v2.patch105
1 files changed, 105 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0509-drm-amdgpu-stop-trying-to-suspend-UVD-sessions-v2.patch b/common/recipes-kernel/linux/files/0509-drm-amdgpu-stop-trying-to-suspend-UVD-sessions-v2.patch
new file mode 100644
index 00000000..8b0179fa
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0509-drm-amdgpu-stop-trying-to-suspend-UVD-sessions-v2.patch
@@ -0,0 +1,105 @@
+From 8f8202f771c182a7244caa5880f50def1bedd713 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Thu, 7 May 2015 15:19:25 +0200
+Subject: [PATCH 0509/1050] drm/amdgpu: stop trying to suspend UVD sessions v2
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Saving the current UVD state on suspend and restoring it on resume
+just doesn't work reliable. Just close cleanup all sessions on suspend.
+
+Ported from radeon commit "12e49feadff6d7b7ebbe852b36943a71524d8d34".
+
+v2: rebased
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com> (v1)
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 -
+ drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 42 +++++++++++++++------------------
+ 2 files changed, 19 insertions(+), 24 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index 7195068..9fefcd9 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -1666,7 +1666,6 @@ struct amdgpu_uvd {
+ struct amdgpu_bo *vcpu_bo;
+ void *cpu_addr;
+ uint64_t gpu_addr;
+- void *saved_bo;
+ atomic_t handles[AMDGPU_MAX_UVD_HANDLES];
+ struct drm_file *filp[AMDGPU_MAX_UVD_HANDLES];
+ struct delayed_work idle_work;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+index b87355c..3ad4a83 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+@@ -221,31 +221,32 @@ int amdgpu_uvd_sw_fini(struct amdgpu_device *adev)
+
+ int amdgpu_uvd_suspend(struct amdgpu_device *adev)
+ {
+- unsigned size;
+- void *ptr;
+- const struct common_firmware_header *hdr;
+- int i;
++ struct amdgpu_ring *ring = &adev->uvd.ring;
++ int i, r;
+
+ if (adev->uvd.vcpu_bo == NULL)
+ return 0;
+
+- for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i)
+- if (atomic_read(&adev->uvd.handles[i]))
+- break;
+-
+- if (i == AMDGPU_MAX_UVD_HANDLES)
+- return 0;
++ for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) {
++ uint32_t handle = atomic_read(&adev->uvd.handles[i]);
++ if (handle != 0) {
++ struct fence *fence;
+
+- hdr = (const struct common_firmware_header *)adev->uvd.fw->data;
++ amdgpu_uvd_note_usage(adev);
+
+- size = amdgpu_bo_size(adev->uvd.vcpu_bo);
+- size -= le32_to_cpu(hdr->ucode_size_bytes);
++ r = amdgpu_uvd_get_destroy_msg(ring, handle, &fence);
++ if (r) {
++ DRM_ERROR("Error destroying UVD (%d)!\n", r);
++ continue;
++ }
+
+- ptr = adev->uvd.cpu_addr;
+- ptr += le32_to_cpu(hdr->ucode_size_bytes);
++ fence_wait(fence, false);
++ fence_put(fence);
+
+- adev->uvd.saved_bo = kmalloc(size, GFP_KERNEL);
+- memcpy(adev->uvd.saved_bo, ptr, size);
++ adev->uvd.filp[i] = NULL;
++ atomic_set(&adev->uvd.handles[i], 0);
++ }
++ }
+
+ return 0;
+ }
+@@ -270,12 +271,7 @@ int amdgpu_uvd_resume(struct amdgpu_device *adev)
+ ptr = adev->uvd.cpu_addr;
+ ptr += le32_to_cpu(hdr->ucode_size_bytes);
+
+- if (adev->uvd.saved_bo != NULL) {
+- memcpy(ptr, adev->uvd.saved_bo, size);
+- kfree(adev->uvd.saved_bo);
+- adev->uvd.saved_bo = NULL;
+- } else
+- memset(ptr, 0, size);
++ memset(ptr, 0, size);
+
+ return 0;
+ }
+--
+1.9.1
+