[PATCH] drm/amdgpu/psp: don't free PSP buffers on suspend

Christian König ckoenig.leichtzumerken at gmail.com
Fri Nov 18 16:50:55 UTC 2022


Am 16.11.22 um 17:40 schrieb Alex Deucher:
> We can reuse the same buffers on resume.
>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

Reviewed-by: Christian König <christian.koenig at amd.com>

But I would like to ad the WARN_ON() to not free anything during suspend 
on newer kernels as well.

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 56 +++++++++++++------------
>   1 file changed, 29 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> index 0a8c30475dda..d9cb4c4b8289 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> @@ -172,6 +172,7 @@ void psp_ta_free_shared_buf(struct ta_mem_context *mem_ctx)
>   {
>   	amdgpu_bo_free_kernel(&mem_ctx->shared_bo, &mem_ctx->shared_mc_addr,
>   			      &mem_ctx->shared_buf);
> +	mem_ctx->shared_bo = NULL;
>   }
>   
>   static void psp_free_shared_bufs(struct psp_context *psp)
> @@ -182,6 +183,7 @@ static void psp_free_shared_bufs(struct psp_context *psp)
>   	/* free TMR memory buffer */
>   	pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL;
>   	amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, pptr);
> +	psp->tmr_bo = NULL;
>   
>   	/* free xgmi shared memory */
>   	psp_ta_free_shared_buf(&psp->xgmi_context.context.mem_context);
> @@ -743,37 +745,39 @@ static int psp_load_toc(struct psp_context *psp,
>   /* Set up Trusted Memory Region */
>   static int psp_tmr_init(struct psp_context *psp)
>   {
> -	int ret;
> +	int ret = 0;
>   	int tmr_size;
>   	void *tmr_buf;
>   	void **pptr;
>   
> -	/*
> -	 * According to HW engineer, they prefer the TMR address be "naturally
> -	 * aligned" , e.g. the start address be an integer divide of TMR size.
> -	 *
> -	 * Note: this memory need be reserved till the driver
> -	 * uninitializes.
> -	 */
> -	tmr_size = PSP_TMR_SIZE(psp->adev);
> -
> -	/* For ASICs support RLC autoload, psp will parse the toc
> -	 * and calculate the total size of TMR needed */
> -	if (!amdgpu_sriov_vf(psp->adev) &&
> -	    psp->toc.start_addr &&
> -	    psp->toc.size_bytes &&
> -	    psp->fw_pri_buf) {
> -		ret = psp_load_toc(psp, &tmr_size);
> -		if (ret) {
> -			DRM_ERROR("Failed to load toc\n");
> -			return ret;
> +	if (!psp->tmr_bo) {
> +		/*
> +		 * According to HW engineer, they prefer the TMR address be "naturally
> +		 * aligned" , e.g. the start address be an integer divide of TMR size.
> +		 *
> +		 * Note: this memory need be reserved till the driver
> +		 * uninitializes.
> +		 */
> +		tmr_size = PSP_TMR_SIZE(psp->adev);
> +
> +		/* For ASICs support RLC autoload, psp will parse the toc
> +		 * and calculate the total size of TMR needed */
> +		if (!amdgpu_sriov_vf(psp->adev) &&
> +		    psp->toc.start_addr &&
> +		    psp->toc.size_bytes &&
> +		    psp->fw_pri_buf) {
> +			ret = psp_load_toc(psp, &tmr_size);
> +			if (ret) {
> +				DRM_ERROR("Failed to load toc\n");
> +				return ret;
> +			}
>   		}
> -	}
>   
> -	pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL;
> -	ret = amdgpu_bo_create_kernel(psp->adev, tmr_size, PSP_TMR_ALIGNMENT,
> -				      AMDGPU_GEM_DOMAIN_VRAM,
> -				      &psp->tmr_bo, &psp->tmr_mc_addr, pptr);
> +		pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL;
> +		ret = amdgpu_bo_create_kernel(psp->adev, tmr_size, PSP_TMR_ALIGNMENT,
> +					      AMDGPU_GEM_DOMAIN_VRAM,
> +					      &psp->tmr_bo, &psp->tmr_mc_addr, pptr);
> +	}
>   
>   	return ret;
>   }
> @@ -2701,8 +2705,6 @@ static int psp_suspend(void *handle)
>   	}
>   
>   out:
> -	psp_free_shared_bufs(psp);
> -
>   	return ret;
>   }
>   



More information about the amd-gfx mailing list