[PATCH 1/8] drm/ast: Acquire I/O-register lock in atomic_commit_tail function

Jocelyn Falempe jfalempe at redhat.com
Tue Oct 11 17:13:22 UTC 2022


On 10/10/2022 12:36, Thomas Zimmermann wrote:
> Hold I/O-register lock in atomic_commit_tail to protect all pipeline
> updates at once. Protects modesetting against concurrent EDID reads.
> 
> Complex modesetting operations involve mode changes and plane updates.
> These steps used to be protected individually against concurrent I/O.
> Make all this atomic wrt to reading display modes via EDID. The EDID
> code in the conenctor's get_modes helper already acquires the necessary
small typo:  connector's

> lock.
> 
> A similar issue was fixed in commit 2d70b9a1482e ("drm/mgag200: Acquire
> I/O-register lock in atomic_commit_tail function") for mgag200.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
> ---
>   drivers/gpu/drm/ast/ast_mode.c | 34 ++++++++++++++++------------------
>   1 file changed, 16 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index d5ee3ad538a8..e1e07928906e 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -1200,20 +1200,6 @@ static int ast_crtc_helper_atomic_check(struct drm_crtc *crtc,
>   	return drm_atomic_add_affected_planes(state, crtc);
>   }
>   
> -static void ast_crtc_helper_atomic_begin(struct drm_crtc *crtc, struct drm_atomic_state *state)
> -{
> -	struct drm_device *dev = crtc->dev;
> -	struct ast_private *ast = to_ast_private(dev);
> -
> -	/*
> -	 * Concurrent operations could possibly trigger a call to
> -	 * drm_connector_helper_funcs.get_modes by trying to read the
> -	 * display modes. Protect access to I/O registers by acquiring
> -	 * the I/O-register lock. Released in atomic_flush().
> -	 */
> -	mutex_lock(&ast->ioregs_lock);
> -}
> -
>   static void
>   ast_crtc_helper_atomic_flush(struct drm_crtc *crtc,
>   			     struct drm_atomic_state *state)
> @@ -1241,8 +1227,6 @@ ast_crtc_helper_atomic_flush(struct drm_crtc *crtc,
>   	//Set Aspeed Display-Port
>   	if (ast->tx_chip_types & AST_TX_ASTDP_BIT)
>   		ast_dp_set_mode(crtc, vbios_mode_info);
> -
> -	mutex_unlock(&ast->ioregs_lock);
>   }
>   
>   static void
> @@ -1301,7 +1285,6 @@ ast_crtc_helper_atomic_disable(struct drm_crtc *crtc,
>   static const struct drm_crtc_helper_funcs ast_crtc_helper_funcs = {
>   	.mode_valid = ast_crtc_helper_mode_valid,
>   	.atomic_check = ast_crtc_helper_atomic_check,
> -	.atomic_begin = ast_crtc_helper_atomic_begin,
>   	.atomic_flush = ast_crtc_helper_atomic_flush,
>   	.atomic_enable = ast_crtc_helper_atomic_enable,
>   	.atomic_disable = ast_crtc_helper_atomic_disable,
> @@ -1771,8 +1754,23 @@ static int ast_astdp_output_init(struct ast_private *ast)
>    * Mode config
>    */
>   
> +static void ast_mode_config_helper_atomic_commit_tail(struct drm_atomic_state *state)
> +{
> +	struct ast_private *ast = to_ast_private(state->dev);
> +
> +	/*
> +	 * Concurrent operations could possibly trigger a call to
> +	 * drm_connector_helper_funcs.get_modes by trying to read the
> +	 * display modes. Protect access to I/O registers by acquiring
> +	 * the I/O-register lock. Released in atomic_flush().
> +	 */
> +	mutex_lock(&ast->ioregs_lock);
> +	drm_atomic_helper_commit_tail_rpm(state);
> +	mutex_unlock(&ast->ioregs_lock);
> +}
> +
>   static const struct drm_mode_config_helper_funcs ast_mode_config_helper_funcs = {
> -	.atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
> +	.atomic_commit_tail = ast_mode_config_helper_atomic_commit_tail,
>   };
>   
>   static const struct drm_mode_config_funcs ast_mode_config_funcs = {

Best regards,

-- 

Jocelyn



More information about the dri-devel mailing list