diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0431-drm-amdgpu-save-and-restore-UVD-context-with-suspend.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0431-drm-amdgpu-save-and-restore-UVD-context-with-suspend.patch | 173 |
1 files changed, 0 insertions, 173 deletions
diff --git a/common/recipes-kernel/linux/files/0431-drm-amdgpu-save-and-restore-UVD-context-with-suspend.patch b/common/recipes-kernel/linux/files/0431-drm-amdgpu-save-and-restore-UVD-context-with-suspend.patch deleted file mode 100644 index ffbc8849..00000000 --- a/common/recipes-kernel/linux/files/0431-drm-amdgpu-save-and-restore-UVD-context-with-suspend.patch +++ /dev/null @@ -1,173 +0,0 @@ -From 880a8ad9990c8cb09e5f991eca25105164245e28 Mon Sep 17 00:00:00 2001 -From: Leo Liu <leo.liu@amd.com> -Date: Fri, 1 Apr 2016 10:36:06 -0400 -Subject: [PATCH 0431/1110] drm/amdgpu: save and restore UVD context with - suspend and resume -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -and revert fix following it accordingly - -Revert "drm/amdgpu: stop trying to suspend UVD sessions v2" -Revert "drm/amdgpu: fix the UVD suspend sequence order" - -Signed-off-by: Leo Liu <leo.liu@amd.com> -Reviewed-by: Christian König <christian.koenig@amd.com> -Signed-off-by: Alex Deucher <alexander.deucher@amd.com> -Signed-off-by: Kalyan Alle <kalyan.alle@amd.com> ---- - drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + - drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 48 ++++++++++++++++++--------------- - drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c | 4 +-- - drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c | 4 +-- - drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 7 ++--- - 5 files changed, 36 insertions(+), 28 deletions(-) - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -index 3ff6b3e..16cdddb 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -@@ -1595,6 +1595,7 @@ struct amdgpu_uvd { - struct amdgpu_bo *vcpu_bo; - void *cpu_addr; - uint64_t gpu_addr; -+ void *saved_bo; - unsigned fw_version; - atomic_t handles[AMDGPU_MAX_UVD_HANDLES]; - struct drm_file *filp[AMDGPU_MAX_UVD_HANDLES]; -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c -index 324bb32..69547c3 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c -@@ -243,32 +243,33 @@ int amdgpu_uvd_sw_fini(struct amdgpu_device *adev) - - int amdgpu_uvd_suspend(struct amdgpu_device *adev) - { -- struct amdgpu_ring *ring = &adev->uvd.ring; -- int i, r; -+ unsigned size; -+ void *ptr; -+ const struct common_firmware_header *hdr; -+ int i; - - if (adev->uvd.vcpu_bo == NULL) - 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; -- -- amdgpu_uvd_note_usage(adev); -- -- r = amdgpu_uvd_get_destroy_msg(ring, handle, false, &fence); -- if (r) { -- DRM_ERROR("Error destroying UVD (%d)!\n", r); -- continue; -- } -+ 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; -+ hdr = (const struct common_firmware_header *)adev->uvd.fw->data; - -- fence_wait(fence, false); -- fence_put(fence); -+ size = amdgpu_bo_size(adev->uvd.vcpu_bo); -+ size -= le32_to_cpu(hdr->ucode_size_bytes); - -- adev->uvd.filp[i] = NULL; -- atomic_set(&adev->uvd.handles[i], 0); -- } -- } -+ ptr = adev->uvd.cpu_addr; -+ ptr += le32_to_cpu(hdr->ucode_size_bytes); -+ -+ adev->uvd.saved_bo = kmalloc(size, GFP_KERNEL); -+ if (!adev->uvd.saved_bo) -+ return -ENOMEM; -+ -+ memcpy(adev->uvd.saved_bo, ptr, size); - - return 0; - } -@@ -295,7 +296,12 @@ int amdgpu_uvd_resume(struct amdgpu_device *adev) - ptr = adev->uvd.cpu_addr; - ptr += le32_to_cpu(hdr->ucode_size_bytes); - -- memset(ptr, 0, size); -+ 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); - - return 0; - } -diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c -index c606ccb..cb46375 100644 ---- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c -+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c -@@ -224,11 +224,11 @@ static int uvd_v4_2_suspend(void *handle) - int r; - struct amdgpu_device *adev = (struct amdgpu_device *)handle; - -- r = amdgpu_uvd_suspend(adev); -+ r = uvd_v4_2_hw_fini(adev); - if (r) - return r; - -- r = uvd_v4_2_hw_fini(adev); -+ r = amdgpu_uvd_suspend(adev); - if (r) - return r; - -diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c -index e3c852d..16476d8 100644 ---- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c -+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c -@@ -220,11 +220,11 @@ static int uvd_v5_0_suspend(void *handle) - int r; - struct amdgpu_device *adev = (struct amdgpu_device *)handle; - -- r = amdgpu_uvd_suspend(adev); -+ r = uvd_v5_0_hw_fini(adev); - if (r) - return r; - -- r = uvd_v5_0_hw_fini(adev); -+ r = amdgpu_uvd_suspend(adev); - if (r) - return r; - -diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c -index 3375e61..d493791 100644 ---- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c -+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c -@@ -214,15 +214,16 @@ static int uvd_v6_0_suspend(void *handle) - int r; - struct amdgpu_device *adev = (struct amdgpu_device *)handle; - -+ r = uvd_v6_0_hw_fini(adev); -+ if (r) -+ return r; -+ - /* Skip this for APU for now */ - if (!(adev->flags & AMD_IS_APU)) { - r = amdgpu_uvd_suspend(adev); - if (r) - return r; - } -- r = uvd_v6_0_hw_fini(adev); -- if (r) -- return r; - - return r; - } --- -2.7.4 - |