[PATCH 3/4] drm/amdgpu: add sdma v5_2 soft reset

Christian König ckoenig.leichtzumerken at gmail.com
Thu Mar 10 10:06:11 UTC 2022


Am 10.03.22 um 07:11 schrieb Victor Zhao:
> enable sdma v5_2 soft reset
>
> Signed-off-by: Victor Zhao <Victor.Zhao at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 79 +++++++++++++++++++++++++-
>   1 file changed, 78 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> index 4d4d1aa51b8a..f9f978d8fe8a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> @@ -806,6 +806,80 @@ static int sdma_v5_2_load_microcode(struct amdgpu_device *adev)
>   	return 0;
>   }
>   
> +static bool sdma_v5_2_check_soft_reset(void *handle, struct amdgpu_job *job)
> +{
> +	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> +
> +	if (job) {
> +		if (!strncmp(job->base.sched->name, "sdma", 4))

That's a really big NAK, please no string comparison in the kernel if it 
isn't absolutely necessary.

Regards,
Christian.

> +			return true;
> +		else
> +			return false;
> +	} else {
> +		u32 tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS2);
> +
> +		if (tmp == 0xffffffff)
> +			return false;
> +
> +		if (tmp & GRBM_STATUS2__SDMA_BUSY_MASK)
> +			return true;
> +		else
> +			return false;
> +	}
> +}
> +
> +static int sdma_v5_2_pre_soft_reset(void *handle)
> +{
> +	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> +	int i, j;
> +	uint32_t tmp, f32_cntl;
> +
> +	for (i = 0; i < adev->sdma.num_instances; i++)
> +		WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_FREEZE), 0x10);
> +
> +	for (i = 0; i < adev->sdma.num_instances; i++) {
> +		for (j = 0; j < 10; j++) {
> +			tmp = RREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_FREEZE));
> +			DRM_DEBUG("SDMA%d_FREEZE=0x%x", i, tmp);
> +			if (tmp & SDMA0_FREEZE__FROZEN_MASK) {
> +				WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_FREEZE), 0);
> +				break;
> +			} else {
> +				udelay(10);
> +			}
> +		}
> +		if (j == 10) {
> +			DRM_ERROR("SDMA%d_FREEZE frozen not set", i);
> +			return -1;
> +		}
> +	}
> +	for (i = 0; i < adev->sdma.num_instances; i++) {
> +		f32_cntl = RREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_F32_CNTL));
> +		f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_F32_CNTL, HALT, 1);
> +		WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_F32_CNTL), f32_cntl);
> +	}
> +
> +	return 0;
> +}
> +
> +static int sdma_v5_2_post_soft_reset(void *handle)
> +{
> +	int i;
> +	uint32_t f32_cntl;
> +	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> +
> +	for (i = 0; i < adev->sdma.num_instances; i++) {
> +		f32_cntl = RREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_F32_CNTL));
> +		f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_F32_CNTL, HALT, 0);
> +		WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_F32_CNTL), f32_cntl);
> +	}
> +
> +	sdma_v5_2_gfx_resume(adev);
> +	udelay(10);
> +
> +	return 0;
> +}
> +
>   static int sdma_v5_2_soft_reset(void *handle)
>   {
>   	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> @@ -831,7 +905,7 @@ static int sdma_v5_2_soft_reset(void *handle)
>   		WREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET, tmp);
>   		tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
>   
> -		udelay(50);
> +		mdelay(2);
>   	}
>   
>   	return 0;
> @@ -1655,6 +1729,9 @@ const struct amd_ip_funcs sdma_v5_2_ip_funcs = {
>   	.resume = sdma_v5_2_resume,
>   	.is_idle = sdma_v5_2_is_idle,
>   	.wait_for_idle = sdma_v5_2_wait_for_idle,
> +	.pre_soft_reset = sdma_v5_2_pre_soft_reset,
> +	.post_soft_reset = sdma_v5_2_post_soft_reset,
> +	.check_soft_reset = sdma_v5_2_check_soft_reset,
>   	.soft_reset = sdma_v5_2_soft_reset,
>   	.set_clockgating_state = sdma_v5_2_set_clockgating_state,
>   	.set_powergating_state = sdma_v5_2_set_powergating_state,



More information about the amd-gfx mailing list