On Thu, Jul 5, 2018 at 11:25 AM, Huang Rui <ray.huang at amd.com> wrote: > On Thu, Jul 05, 2018 at 05:09:26PM +0800, Evan Quan wrote: >> Without this pin, the csb buffer will be filled with inconsistent >> data after S3 resume. And that will causes gfx hang on gfxoff >> exit since this csb will be executed then. >> >> Change-Id: I1ae1f2eed096eaba5f601cf2a3e2650c8e583dc9 >> Signed-off-by: Evan Quan <evan.quan at amd.com> > > It is nice to have the comments behind of csb_vram_pin function to explain > why we need "pin" here during resume phase. > > Reviewed-by: Huang Rui <ray.huang at amd.com> Do the save restore buffers in gfx7 and 8 need a similar fix? Alex > >> --- >> drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 40 +++++++++++++++++++++++++++ >> 1 file changed, 40 insertions(+) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c >> index ac46eabe3bcd..65cc30766658 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c >> @@ -943,6 +943,7 @@ static int gfx_v9_0_rlc_init(struct amdgpu_device *adev) >> dst_ptr = adev->gfx.rlc.cs_ptr; >> gfx_v9_0_get_csb_buffer(adev, dst_ptr); >> amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj); >> + amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj); >> amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); >> } >> >> @@ -971,6 +972,39 @@ static int gfx_v9_0_rlc_init(struct amdgpu_device *adev) >> return 0; >> } >> >> +static int gfx_v9_0_csb_vram_pin(struct amdgpu_device *adev) >> +{ >> + uint64_t gpu_addr; >> + int r; >> + >> + r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false); >> + if (unlikely(r != 0)) >> + return r; >> + >> + r = amdgpu_bo_pin(adev->gfx.rlc.clear_state_obj, >> + AMDGPU_GEM_DOMAIN_VRAM, &gpu_addr); >> + if (!r) >> + adev->gfx.rlc.clear_state_gpu_addr = gpu_addr; >> + >> + amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); >> + >> + return r; >> +} >> + >> +static void gfx_v9_0_csb_vram_unpin(struct amdgpu_device *adev) >> +{ >> + int r; >> + >> + if (!adev->gfx.rlc.clear_state_obj) >> + return; >> + >> + r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, true); >> + if (likely(r == 0)) { >> + amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj); >> + amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); >> + } >> +} >> + >> static void gfx_v9_0_mec_fini(struct amdgpu_device *adev) >> { >> amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL); >> @@ -3116,6 +3150,10 @@ static int gfx_v9_0_hw_init(void *handle) >> >> gfx_v9_0_gpu_init(adev); >> >> + r = gfx_v9_0_csb_vram_pin(adev); >> + if (r) >> + return r; >> + >> r = gfx_v9_0_rlc_resume(adev); >> if (r) >> return r; >> @@ -3224,6 +3262,8 @@ static int gfx_v9_0_hw_fini(void *handle) >> gfx_v9_0_cp_enable(adev, false); >> gfx_v9_0_rlc_stop(adev); >> >> + gfx_v9_0_csb_vram_unpin(adev); >> + >> return 0; >> } >> >> -- >> 2.18.0 >> >> _______________________________________________ >> amd-gfx mailing list >> amd-gfx at lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/amd-gfx > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx