[PATCH 15/15] drm/ast: Only look up VBIOS mode on full modesets

Jocelyn Falempe jfalempe at redhat.com
Mon Jan 27 15:00:21 UTC 2025


On 24/01/2025 08:57, Thomas Zimmermann wrote:
> Only look up the VBIOS mode during atomic_check if the display mode
> changes. For page flips, the previous settings still apply. Avoids the
> runtime overhead of looking up the VBIOS mode on each page flip.

Thanks, it's a nice optimization.

Reviewed-by: Jocelyn Falempe <jfalempe at redhat.com>

-- 

Jocelyn

> 
> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
> ---
>   drivers/gpu/drm/ast/ast_mode.c | 52 ++++++++++++++++++----------------
>   1 file changed, 27 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index 584fa37b8d6c3..f8c10329af079 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -996,32 +996,34 @@ static int ast_crtc_helper_atomic_check(struct drm_crtc *crtc,
>   	}
>   
>   	/*
> -	 * Find the VBIOS mode and adjust the DRM display mode accordingly.
> +	 * Find the VBIOS mode and adjust the DRM display mode accordingly
> +	 * if a full modeset is required. Otherwise keep the existing values.
>   	 */
> -
> -	vmode = ast_vbios_find_mode(ast, &crtc_state->mode);
> -	if (!vmode)
> -		return -EINVAL;
> -	ast_state->vmode = vmode;
> -
> -	if (vmode->flags & HBorder)
> -		hborder = 8;
> -	if (vmode->flags & VBorder)
> -		vborder = 8;
> -
> -	adjusted_mode->crtc_hdisplay = vmode->hde;
> -	adjusted_mode->crtc_hblank_start = vmode->hde + hborder;
> -	adjusted_mode->crtc_hblank_end = vmode->ht - hborder;
> -	adjusted_mode->crtc_hsync_start = vmode->hde + hborder + vmode->hfp;
> -	adjusted_mode->crtc_hsync_end = vmode->hde + hborder + vmode->hfp + vmode->hsync;
> -	adjusted_mode->crtc_htotal = vmode->ht;
> -
> -	adjusted_mode->crtc_vdisplay = vmode->vde;
> -	adjusted_mode->crtc_vblank_start = vmode->vde + vborder;
> -	adjusted_mode->crtc_vblank_end = vmode->vt - vborder;
> -	adjusted_mode->crtc_vsync_start = vmode->vde + vborder + vmode->vfp;
> -	adjusted_mode->crtc_vsync_end = vmode->vde + vborder + vmode->vfp + vmode->vsync;
> -	adjusted_mode->crtc_vtotal = vmode->vt;
> +	if (drm_atomic_crtc_needs_modeset(crtc_state)) {
> +		vmode = ast_vbios_find_mode(ast, &crtc_state->mode);
> +		if (!vmode)
> +			return -EINVAL;
> +		ast_state->vmode = vmode;
> +
> +		if (vmode->flags & HBorder)
> +			hborder = 8;
> +		if (vmode->flags & VBorder)
> +			vborder = 8;
> +
> +		adjusted_mode->crtc_hdisplay = vmode->hde;
> +		adjusted_mode->crtc_hblank_start = vmode->hde + hborder;
> +		adjusted_mode->crtc_hblank_end = vmode->ht - hborder;
> +		adjusted_mode->crtc_hsync_start = vmode->hde + hborder + vmode->hfp;
> +		adjusted_mode->crtc_hsync_end = vmode->hde + hborder + vmode->hfp + vmode->hsync;
> +		adjusted_mode->crtc_htotal = vmode->ht;
> +
> +		adjusted_mode->crtc_vdisplay = vmode->vde;
> +		adjusted_mode->crtc_vblank_start = vmode->vde + vborder;
> +		adjusted_mode->crtc_vblank_end = vmode->vt - vborder;
> +		adjusted_mode->crtc_vsync_start = vmode->vde + vborder + vmode->vfp;
> +		adjusted_mode->crtc_vsync_end = vmode->vde + vborder + vmode->vfp + vmode->vsync;
> +		adjusted_mode->crtc_vtotal = vmode->vt;
> +	}
>   
>   	return 0;
>   }



More information about the dri-devel mailing list