diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0432-drm-amdgpu-save-and-restore-the-firwmware-cache-part.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0432-drm-amdgpu-save-and-restore-the-firwmware-cache-part.patch | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0432-drm-amdgpu-save-and-restore-the-firwmware-cache-part.patch b/common/recipes-kernel/linux/files/0432-drm-amdgpu-save-and-restore-the-firwmware-cache-part.patch new file mode 100644 index 00000000..7fd7bab6 --- /dev/null +++ b/common/recipes-kernel/linux/files/0432-drm-amdgpu-save-and-restore-the-firwmware-cache-part.patch @@ -0,0 +1,92 @@ +From bda6d7754c62d614accae5a483b85dc6dfe7364f Mon Sep 17 00:00:00 2001 +From: Leo Liu <leo.liu@amd.com> +Date: Mon, 4 Apr 2016 10:55:43 -0400 +Subject: [PATCH 0432/1110] drm/amdgpu: save and restore the firwmware cache + part when suspend resume +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +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_uvd.c | 30 +++++++++++++----------------- + 1 file changed, 13 insertions(+), 17 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +index 69547c3..86dead7 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +@@ -245,7 +245,6 @@ int amdgpu_uvd_suspend(struct amdgpu_device *adev) + { + unsigned size; + void *ptr; +- const struct common_firmware_header *hdr; + int i; + + if (adev->uvd.vcpu_bo == NULL) +@@ -257,15 +256,11 @@ int amdgpu_uvd_suspend(struct amdgpu_device *adev) + + if (i == AMDGPU_MAX_UVD_HANDLES) + return 0; +- hdr = (const struct common_firmware_header *)adev->uvd.fw->data; + + size = amdgpu_bo_size(adev->uvd.vcpu_bo); +- size -= le32_to_cpu(hdr->ucode_size_bytes); +- + ptr = adev->uvd.cpu_addr; +- ptr += le32_to_cpu(hdr->ucode_size_bytes); +- +- adev->uvd.saved_bo = kmalloc(size, GFP_KERNEL); ++ ++ adev->uvd.saved_bo = kmalloc(size, GFP_KERNEL); + if (!adev->uvd.saved_bo) + return -ENOMEM; + +@@ -278,30 +273,31 @@ int amdgpu_uvd_resume(struct amdgpu_device *adev) + { + unsigned size; + void *ptr; +- const struct common_firmware_header *hdr; +- unsigned offset; + + if (adev->uvd.vcpu_bo == NULL) + return -EINVAL; + +- hdr = (const struct common_firmware_header *)adev->uvd.fw->data; +- offset = le32_to_cpu(hdr->ucode_array_offset_bytes); +- memcpy(adev->uvd.cpu_addr, (adev->uvd.fw->data) + offset, +- (adev->uvd.fw->size) - offset); +- + cancel_delayed_work_sync(&adev->uvd.idle_work); + + size = amdgpu_bo_size(adev->uvd.vcpu_bo); +- size -= le32_to_cpu(hdr->ucode_size_bytes); + 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 ++ } else { ++ const struct common_firmware_header *hdr; ++ unsigned offset; ++ ++ hdr = (const struct common_firmware_header *)adev->uvd.fw->data; ++ offset = le32_to_cpu(hdr->ucode_array_offset_bytes); ++ memcpy(adev->uvd.cpu_addr, (adev->uvd.fw->data) + offset, ++ (adev->uvd.fw->size) - offset); ++ size -= le32_to_cpu(hdr->ucode_size_bytes); ++ ptr += le32_to_cpu(hdr->ucode_size_bytes); + memset(ptr, 0, size); ++ } + + return 0; + } +-- +2.7.4 + |