[PATCH v2 9/9] drm/amdgpu: read back register after written

Christian König christian.koenig at amd.com
Fri May 16 07:07:56 UTC 2025


On 5/15/25 18:41, David (Ming Qiang) Wu wrote:
> The addition of register read-back in VCN v5.0.1 is intended to prevent
> potential race conditions.
> 
> Signed-off-by: David (Ming Qiang) Wu <David.Wu3 at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c | 22 ++++++++++++++++++++--
>  1 file changed, 20 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
> index 60ee6e02e6ac..79d36d48a6b6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
> @@ -657,8 +657,11 @@ static int vcn_v5_0_1_start_dpg_mode(struct amdgpu_vcn_inst *vinst,
>  	WREG32_SOC15(VCN, vcn_inst, regVCN_RB1_DB_CTRL,
>  		ring->doorbell_index << VCN_RB1_DB_CTRL__OFFSET__SHIFT |
>  		VCN_RB1_DB_CTRL__EN_MASK);
> -	/* Read DB_CTRL to flush the write DB_CTRL command. */
> -	RREG32_SOC15(VCN, vcn_inst, regVCN_RB1_DB_CTRL);
> +
> +	/* Keeping one read-back to ensure all register writes are done,
> +	 * otherwise it may introduce race conditions.
> +	 */
> +	RREG32_SOC15(VCN, vcn_inst, regUVD_STATUS);

I'm not sure that this is a good idea.

The read back from specific registers was usually to sync up with the clock driving those registers, e.g. the VCN_RB1_DB_CTRL register here.

Could be that for VCN we only have one clock domain, but if you would do this for one of the old PLLs for example I can guarantee that it won't work.

Regards,
Christian.


>  
>  	return 0;
>  }
> @@ -809,6 +812,11 @@ static int vcn_v5_0_1_start(struct amdgpu_vcn_inst *vinst)
>  	WREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE, tmp);
>  	fw_shared->sq.queue_mode &= ~(FW_QUEUE_RING_RESET | FW_QUEUE_DPG_HOLD_OFF);
>  
> +	/* Keeping one read-back to ensure all register writes are done,
> +	 * otherwise it may introduce race conditions.
> +	 */
> +	RREG32_SOC15(VCN, vcn_inst, regUVD_STATUS);
> +
>  	return 0;
>  }
>  
> @@ -843,6 +851,11 @@ static void vcn_v5_0_1_stop_dpg_mode(struct amdgpu_vcn_inst *vinst)
>  	/* disable dynamic power gating mode */
>  	WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_POWER_STATUS), 0,
>  		~UVD_POWER_STATUS__UVD_PG_MODE_MASK);
> +
> +	/* Keeping one read-back to ensure all register writes are done,
> +	 * otherwise it may introduce race conditions.
> +	 */
> +	RREG32_SOC15(VCN, vcn_inst, regUVD_STATUS);
>  }
>  
>  /**
> @@ -918,6 +931,11 @@ static int vcn_v5_0_1_stop(struct amdgpu_vcn_inst *vinst)
>  	/* clear status */
>  	WREG32_SOC15(VCN, vcn_inst, regUVD_STATUS, 0);
>  
> +	/* Keeping one read-back to ensure all register writes are done,
> +	 * otherwise it may introduce race conditions.
> +	 */
> +	RREG32_SOC15(VCN, vcn_inst, regUVD_STATUS);
> +
>  	return 0;
>  }
>  



More information about the amd-gfx mailing list