[PATCH] drm/amdgpu/vcn: add shared menory restore after wake up from sleep.

Alex Deucher alexdeucher at gmail.com
Fri Apr 3 15:37:17 UTC 2020


On Fri, Apr 3, 2020 at 8:52 AM James Zhu <James.Zhu at amd.com> wrote:
>
> VCN shared memory needs restore after wake up during S3 test.

How big is the shared memory?  It might be better to allocate the
memory once at sw_init and then free it in sw_fini rather than
allocating and freeing in every suspend/resume.

Alex

>
> Signed-off-by: James Zhu <James.Zhu at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 26 ++++++++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h |  1 +
>  2 files changed, 27 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> index d653a18..5891390 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> @@ -205,6 +205,7 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)
>                 if (adev->vcn.harvest_config & (1 << j))
>                         continue;
>
> +               kvfree(adev->vcn.inst[j].saved_shm_bo);
>                 amdgpu_bo_free_kernel(&adev->vcn.inst[j].fw_shared_bo,
>                                           &adev->vcn.inst[j].fw_shared_gpu_addr,
>                                           (void **)&adev->vcn.inst[j].fw_shared_cpu_addr);
> @@ -254,6 +255,18 @@ int amdgpu_vcn_suspend(struct amdgpu_device *adev)
>                         return -ENOMEM;
>
>                 memcpy_fromio(adev->vcn.inst[i].saved_bo, ptr, size);
> +
> +               if (adev->vcn.inst[i].fw_shared_bo == NULL)
> +                       return 0;
> +
> +               size = amdgpu_bo_size(adev->vcn.inst[i].fw_shared_bo);
> +               ptr = adev->vcn.inst[i].fw_shared_cpu_addr;
> +
> +               adev->vcn.inst[i].saved_shm_bo = kvmalloc(size, GFP_KERNEL);
> +               if (!adev->vcn.inst[i].saved_shm_bo)
> +                       return -ENOMEM;
> +
> +               memcpy_fromio(adev->vcn.inst[i].saved_shm_bo, ptr, size);
>         }
>         return 0;
>  }
> @@ -291,6 +304,19 @@ int amdgpu_vcn_resume(struct amdgpu_device *adev)
>                         }
>                         memset_io(ptr, 0, size);
>                 }
> +
> +               if (adev->vcn.inst[i].fw_shared_bo == NULL)
> +                       return -EINVAL;
> +
> +               size = amdgpu_bo_size(adev->vcn.inst[i].fw_shared_bo);
> +               ptr = adev->vcn.inst[i].fw_shared_cpu_addr;
> +
> +               if (adev->vcn.inst[i].saved_shm_bo != NULL) {
> +                       memcpy_toio(ptr, adev->vcn.inst[i].saved_shm_bo, size);
> +                       kvfree(adev->vcn.inst[i].saved_shm_bo);
> +                       adev->vcn.inst[i].saved_shm_bo = NULL;
> +               } else
> +                       memset_io(ptr, 0, size);
>         }
>         return 0;
>  }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
> index f739e1a..bd77dae 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
> @@ -194,6 +194,7 @@ struct amdgpu_vcn_inst {
>         atomic_t                dpg_enc_submission_cnt;
>         void                    *fw_shared_cpu_addr;
>         uint64_t                fw_shared_gpu_addr;
> +       void                    *saved_shm_bo;
>  };
>
>  struct amdgpu_vcn {
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list