答复: [PATCH 2/2] drm/amdgpu: save/restore uvd fence sequence number in suspend/resume
Qu, Jim
Jim.Qu at amd.com
Thu Dec 14 13:50:25 UTC 2017
Hi Christian,
I remember the amdgpu_fence_driver_start_ring() function is called by amdgpu_ring_init (), so the function should never be called in amdgpu_device_resume().
Thanks
JimQu
-----邮件原件-----
发件人: Christian König [mailto:ckoenig.leichtzumerken at gmail.com]
发送时间: 2017年12月14日 20:57
收件人: Qu, Jim <Jim.Qu at amd.com>; amd-gfx at lists.freedesktop.org
主题: Re: [PATCH 2/2] drm/amdgpu: save/restore uvd fence sequence number in suspend/resume
Am 14.12.2017 um 12:38 schrieb Jim Qu:
> otherwise, uvd block will be never powered up in ring begin_use()
> callback. uvd ring test will be fail in resume in rumtime pm.
NAK, that should already be done by amdgpu_fence_driver_start_ring().
If this doesn't work please try to figure out why
amdgpu_fence_driver_start_ring() isn't called during resume (Or if it is called, but not in the right order or whatever really goes wrong here).
Regards,
Christian.
>
> Change-Id: I71b6c00bad174c90e12628e6037dc04a4ff9d9f2
> Signed-off-by: Jim Qu <Jim.Qu at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 10 ++++++++--
> drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h | 1 +
> 2 files changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> index 343b682..a2d0b84 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> @@ -293,6 +293,7 @@ int amdgpu_uvd_suspend(struct amdgpu_device *adev)
> unsigned size;
> void *ptr;
> int i;
> + struct amdgpu_fence_driver *drv = &adev->uvd.ring.fence_drv;
>
> cancel_delayed_work_sync(&adev->uvd.idle_work);
>
> @@ -303,9 +304,11 @@ int amdgpu_uvd_suspend(struct amdgpu_device *adev)
> if (atomic_read(&adev->uvd.handles[i]))
> break;
>
> - if (i == AMDGPU_MAX_UVD_HANDLES)
> + if (i == AMDGPU_MAX_UVD_HANDLES) {
> + if (drv->cpu_addr)
> + adev->uvd.fence_seq = le32_to_cpu(*drv->cpu_addr);
> return 0;
> -
> + }
> size = amdgpu_bo_size(adev->uvd.vcpu_bo);
> ptr = adev->uvd.cpu_addr;
>
> @@ -322,6 +325,7 @@ int amdgpu_uvd_resume(struct amdgpu_device *adev)
> {
> unsigned size;
> void *ptr;
> + struct amdgpu_fence_driver *drv = &adev->uvd.ring.fence_drv;
>
> if (adev->uvd.vcpu_bo == NULL)
> return -EINVAL;
> @@ -346,6 +350,8 @@ int amdgpu_uvd_resume(struct amdgpu_device *adev)
> ptr += le32_to_cpu(hdr->ucode_size_bytes);
> }
> memset_io(ptr, 0, size);
> + if (drv->cpu_addr)
> + *drv->cpu_addr = le32_to_cpu(adev->uvd.fence_seq);
> }
>
> return 0;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> index 32ea20b..88f6db9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> @@ -55,6 +55,7 @@ struct amdgpu_uvd {
> struct drm_sched_entity entity_enc;
> uint32_t srbm_soft_reset;
> unsigned num_enc_rings;
> + uint32_t fence_seq;
> };
>
> int amdgpu_uvd_sw_init(struct amdgpu_device *adev);
More information about the amd-gfx
mailing list