drm/amdgpu: save and restore the firwmware cache part when suspend resume
authorLeo Liu <leo.liu@amd.com>
Mon, 4 Apr 2016 14:55:43 +0000 (10:55 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 4 Apr 2016 21:01:00 +0000 (17:01 -0400)
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>
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c

index 4b8ca3515fbc63c05bd79e9844c13a92ae758f54..338da80006b66ced7671b5ed63fabb02750355ba 100644 (file)
@@ -243,7 +243,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)
@@ -256,13 +255,8 @@ 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);
        if (!adev->uvd.saved_bo)
@@ -277,28 +271,29 @@ 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);
-
        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;
 }