[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