[PATCH 07/15] drm/ast: Always validate H/V sync flags
Jocelyn Falempe
jfalempe at redhat.com
Mon Jan 27 14:44:12 UTC 2025
On 24/01/2025 08:57, Thomas Zimmermann wrote:
> The ast driver matches DRM display modes against an internal list of
> modes supported by the VBIOS. Matching H/V sync flags between modes is
> preferred, but optional. If sync flags are not matching, the driver
> would program the VBIOS settings to hardware and let the display handle
> the difference.
>
> DRM modes are generated from attached displays or standard mode lines.
> Therefore differences to the VBIOS modes are not just cosmetical, but
> signal possible incompatibility with the display hardware.
>
> Hence make matching H/V sync flags mandatory. If the VBIOS does not
> support a certain mode, we should report it as unsupported. Note that
> the VBIOS mode tables all appear to refer to standard modes.
>
> (If sync flags really make no difference to the VBIOS, the ast driver
> shouldn't match them in the first place.)
Thanks, it looks good to me.
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 | 45 ++++++++++++++--------------------
> 1 file changed, 18 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index fca625518a873..48b46dc3a618e 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -113,8 +113,8 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
> {
> u32 refresh_rate_index = 0, refresh_rate;
> const struct ast_vbios_enhtable *best = NULL;
> + const struct ast_vbios_enhtable *loop;
> u32 hborder, vborder;
> - bool check_sync;
>
> switch (format->cpp[0] * 8) {
> case 8:
> @@ -176,36 +176,27 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
> }
>
> refresh_rate = drm_mode_vrefresh(mode);
> - check_sync = vbios_mode->enh_table->flags & WideScreenMode;
> -
> - while (1) {
> - const struct ast_vbios_enhtable *loop = vbios_mode->enh_table;
> -
> - while (loop->refresh_rate != 0xff) {
> - if ((check_sync) &&
> - (((mode->flags & DRM_MODE_FLAG_NVSYNC) &&
> - (loop->flags & PVSync)) ||
> - ((mode->flags & DRM_MODE_FLAG_PVSYNC) &&
> - (loop->flags & NVSync)) ||
> - ((mode->flags & DRM_MODE_FLAG_NHSYNC) &&
> - (loop->flags & PHSync)) ||
> - ((mode->flags & DRM_MODE_FLAG_PHSYNC) &&
> - (loop->flags & NHSync)))) {
> - loop++;
> - continue;
> - }
> - if (loop->refresh_rate <= refresh_rate
> - && (!best || loop->refresh_rate > best->refresh_rate))
> - best = loop;
> +
> + loop = vbios_mode->enh_table;
> +
> + while (loop->refresh_rate != 0xff) {
> + if (((mode->flags & DRM_MODE_FLAG_NVSYNC) && (loop->flags & PVSync)) ||
> + ((mode->flags & DRM_MODE_FLAG_PVSYNC) && (loop->flags & NVSync)) ||
> + ((mode->flags & DRM_MODE_FLAG_NHSYNC) && (loop->flags & PHSync)) ||
> + ((mode->flags & DRM_MODE_FLAG_PHSYNC) && (loop->flags & NHSync))) {
> loop++;
> + continue;
> }
> - if (best || !check_sync)
> - break;
> - check_sync = 0;
> + if (loop->refresh_rate <= refresh_rate &&
> + (!best || loop->refresh_rate > best->refresh_rate))
> + best = loop;
> + loop++;
> }
>
> - if (best)
> - vbios_mode->enh_table = best;
> + if (!best)
> + return false;
> +
> + vbios_mode->enh_table = best;
>
> hborder = (vbios_mode->enh_table->flags & HBorder) ? 8 : 0;
> vborder = (vbios_mode->enh_table->flags & VBorder) ? 8 : 0;
More information about the dri-devel
mailing list