On Fri, Apr 3, 2020 at 8:52 AM James Zhu <James.Zhu@xxxxxxx> 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@xxxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx