For inclusion through drm-intel:

Acked-by: Maarten Lankhorst <[email protected]>

On 6/12/26 16:42, Ville Syrjala wrote:
> From: Ville Syrjälä <[email protected]>
>
> Add a new mode matching flag DRM_MODE_MATCH_TIMINGS_VRR. This is
> identical to DRM_MODE_MATCH_TIMINGS, except it requires the vsync
> pulse to remain anchored to the end of vtotal, as opposed to the
> start of the frame. VRR capable hardware can therefore treat
> matching modes as just variants of the same mode with a different
> vblank lengths.
>
> Signed-off-by: Ville Syrjälä <[email protected]>
> ---
>  drivers/gpu/drm/drm_modes.c | 23 +++++++++++++++++++++++
>  include/drm/drm_modes.h     |  1 +
>  2 files changed, 24 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
> index 3f8e025fd6d9..e1eed13a8e94 100644
> --- a/drivers/gpu/drm/drm_modes.c
> +++ b/drivers/gpu/drm/drm_modes.c
> @@ -1469,6 +1469,25 @@ struct drm_display_mode *drm_mode_duplicate(struct 
> drm_device *dev,
>  }
>  EXPORT_SYMBOL(drm_mode_duplicate);
>  
> +static bool drm_mode_match_timings_vrr(const struct drm_display_mode *mode1,
> +                                    const struct drm_display_mode *mode2)
> +{
> +     int mode1_vsync_start_offset = mode1->vtotal - mode1->vsync_start;
> +     int mode1_vsync_end_offset = mode1->vtotal - mode1->vsync_end;
> +     int mode2_vsync_start_offset = mode2->vtotal - mode2->vsync_start;
> +     int mode2_vsync_end_offset = mode2->vtotal - mode2->vsync_end;
> +
> +     return mode1->hdisplay == mode2->hdisplay &&
> +             mode1->hsync_start == mode2->hsync_start &&
> +             mode1->hsync_end == mode2->hsync_end &&
> +             mode1->htotal == mode2->htotal &&
> +             mode1->hskew == mode2->hskew &&
> +             mode1->vdisplay == mode2->vdisplay &&
> +             mode1_vsync_start_offset == mode2_vsync_start_offset &&
> +             mode1_vsync_end_offset == mode2_vsync_end_offset &&
> +             mode1->vscan == mode2->vscan;
> +}
> +
>  static bool drm_mode_match_timings(const struct drm_display_mode *mode1,
>                                  const struct drm_display_mode *mode2)
>  {
> @@ -1538,6 +1557,10 @@ bool drm_mode_match(const struct drm_display_mode 
> *mode1,
>       if (!mode1 || !mode2)
>               return false;
>  
> +     if (match_flags & DRM_MODE_MATCH_TIMINGS_VRR &&
> +         !drm_mode_match_timings_vrr(mode1, mode2))
> +             return false;
> +
>       if (match_flags & DRM_MODE_MATCH_TIMINGS &&
>           !drm_mode_match_timings(mode1, mode2))
>               return false;
> diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h
> index b9bb92e4b029..6e3eccc3c349 100644
> --- a/include/drm/drm_modes.h
> +++ b/include/drm/drm_modes.h
> @@ -193,6 +193,7 @@ enum drm_mode_status {
>  #define DRM_MODE_MATCH_FLAGS (1 << 2)
>  #define DRM_MODE_MATCH_3D_FLAGS (1 << 3)
>  #define DRM_MODE_MATCH_ASPECT_RATIO (1 << 4)
> +#define DRM_MODE_MATCH_TIMINGS_VRR (1 << 5)
>  
>  /**
>   * struct drm_display_mode - DRM kernel-internal display mode structure

Reply via email to