Reviewed-by: Xiaojie Yuan <xiaojie.y...@amd.com>

BR,
Xiaojie

> On Aug 5, 2019, at 10:20 AM, Xu, Feifei <feifei...@amd.com> wrote:
> 
> Reviewed-by: Feifei Xu <feifei...@amd.com>
> 
> -----Original Message-----
> From: amd-gfx <amd-gfx-boun...@lists.freedesktop.org> On Behalf Of Gao Likun
> Sent: Monday, August 5, 2019 10:07 AM
> To: amd-gfx@lists.freedesktop.org
> Cc: Deucher, Alexander <alexander.deuc...@amd.com>; Gao, Likun 
> <likun....@amd.com>; Paul Gover <pmw.go...@yahoo.co.uk>; Yuan, Xiaojie 
> <xiaojie.y...@amd.com>
> Subject: [PATCH] drm/amdgpu: pin the csb buffer on hw init for gfx v8
> 
> From: Likun Gao <likun....@amd.com>
> 
> 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.
> 
> Signed-off-by: Likun Gao <likun....@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 40 +++++++++++++++++++++++++++++++++++
> 1 file changed, 40 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c 
> b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> index d290718..98e5aa8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> @@ -1317,6 +1317,39 @@ static int gfx_v8_0_rlc_init(struct amdgpu_device 
> *adev)
>    return 0;
> }
> 
> +static int gfx_v8_0_csb_vram_pin(struct amdgpu_device *adev) {
> +    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);
> +    if (!r)
> +        adev->gfx.rlc.clear_state_gpu_addr =
> +            amdgpu_bo_gpu_offset(adev->gfx.rlc.clear_state_obj);
> +
> +    amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
> +
> +    return r;
> +}
> +
> +static void gfx_v8_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_v8_0_mec_fini(struct amdgpu_device *adev)  {
>    amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL); @@ -4791,6 
> +4824,10 @@ static int gfx_v8_0_hw_init(void *handle)
>    gfx_v8_0_init_golden_registers(adev);
>    gfx_v8_0_constants_init(adev);
> 
> +    r = gfx_v8_0_csb_vram_pin(adev);
> +    if (r)
> +        return r;
> +
>    r = adev->gfx.rlc.funcs->resume(adev);
>    if (r)
>        return r;
> @@ -4907,6 +4944,9 @@ static int gfx_v8_0_hw_fini(void *handle)
>    else
>        pr_err("rlc is busy, skip halt rlc\n");
>    amdgpu_gfx_rlc_exit_safe_mode(adev);
> +
> +    gfx_v8_0_csb_vram_unpin(adev);
> +
>    return 0;
> }
> 
> --
> 2.7.4
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to