Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d23be4e3 authored by Leo Liu's avatar Leo Liu Committed by Alex Deucher
Browse files

drm/amdgpu: save and restore the firwmware cache part when suspend resume

parent 3f99dd81
Loading
Loading
Loading
Loading
+11 −16
Original line number Diff line number Diff line
@@ -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;
}