]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu/vce: Clear VCPU BO, don't unmap/unreserve (v4)
authorTimur Kristóf <timur.kristof@gmail.com>
Fri, 7 Nov 2025 15:57:38 +0000 (16:57 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 12 Nov 2025 02:54:18 +0000 (21:54 -0500)
The VCPU BO doesn't only contain the VCE firmware but also other
ranges that the VCE uses for its stack and data. Let's initialize
this to zero to avoid having garbage in the VCPU BO.

Additionally, don't unmap/unreserve the VCPU BO.
The VCPU BO needs to stay at the same location before and after
sleep/resume because the FW code is not relocatable once it's
started.

Signed-off-by: Timur Kristóf <timur.kristof@gmail.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_vce.c

index 3cbdc76656ab222cac7a50b9a58374e23bb5ca3b..5b5f44e040ebf97699666b8570240a67754239de 100644 (file)
@@ -314,40 +314,23 @@ int amdgpu_vce_suspend(struct amdgpu_device *adev)
  */
 int amdgpu_vce_resume(struct amdgpu_device *adev)
 {
-       void *cpu_addr;
        const struct common_firmware_header *hdr;
        unsigned int offset;
-       int r, idx;
+       int idx;
 
        if (adev->vce.vcpu_bo == NULL)
                return -EINVAL;
 
-       r = amdgpu_bo_reserve(adev->vce.vcpu_bo, false);
-       if (r) {
-               dev_err(adev->dev, "(%d) failed to reserve VCE bo\n", r);
-               return r;
-       }
-
-       r = amdgpu_bo_kmap(adev->vce.vcpu_bo, &cpu_addr);
-       if (r) {
-               amdgpu_bo_unreserve(adev->vce.vcpu_bo);
-               dev_err(adev->dev, "(%d) VCE map failed\n", r);
-               return r;
-       }
-
        hdr = (const struct common_firmware_header *)adev->vce.fw->data;
        offset = le32_to_cpu(hdr->ucode_array_offset_bytes);
 
        if (drm_dev_enter(adev_to_drm(adev), &idx)) {
-               memcpy_toio(cpu_addr, adev->vce.fw->data + offset,
+               memset_io(adev->vce.cpu_addr, 0, amdgpu_bo_size(adev->vce.vcpu_bo));
+               memcpy_toio(adev->vce.cpu_addr, adev->vce.fw->data + offset,
                            adev->vce.fw->size - offset);
                drm_dev_exit(idx);
        }
 
-       amdgpu_bo_kunmap(adev->vce.vcpu_bo);
-
-       amdgpu_bo_unreserve(adev->vce.vcpu_bo);
-
        return 0;
 }