RE: [PATCH 3/4] drm/amd/display: Add HDMI 2.1 VRR support from HF-VSDB

"Zuo, Jerry" <[email protected]> Thu, 6 Aug 2026 20:17:51 +0000
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <CHXPR12MB9992205CBBB3B7601A13A3B38BE5D22@CHXPR12MB999220.namprd12.prod.outlook.com>
AMD General

> -----Original Message-----
> From: Wentland, Harry <[email protected]>
> Sent: Friday, July 31, 2026 15:57
> To: Zuo, Jerry <[email protected]>; [email protected]
> Subject: Re: [PATCH 3/4] drm/amd/display: Add HDMI 2.1 VRR support from
> HF-VSDB
>
>
>
> On 2026-07-30 13:17, Fangzhi Zuo wrote:
> > why:
> > HDMI 2.1 sinks advertise their VRR range in the HDMI Forum VSDB
> > (HF-VSDB), but amdgpu derived FreeSync capability only from the AMD
> > VSDB. Sinks that expose just the HDMI Forum VRR capability (e.g. HDMI
> > compliance EDIDs) were therefore reported as not VRR capable.
> >
> > how:
> > - In amdgpu_dm_update_freesync_caps(), when the AMD VSDB does not
> >   provide a valid FreeSync range, fall back to the HDMI 2.1 VRR range
> >   parsed by DRM core from the HF-VSDB
> >   (connector->display_info.hdmi.vrr_cap). VRRMAX = 0 means "up to the
> >   Base Refresh Rate"; when the EDID provides no monitor range maximum
> >   either, fall back to the Base Refresh Rate (the highest refresh-rate
> >   mode of the preferred timing) so a valid VRR range is still reported
> >   to userspace.
> > - Add VRR debug logging along the FreeSync capability and config paths.
> >
> > Signed-off-by: Fangzhi Zuo <[email protected]>
> > ---
> >  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  8 +++
> >  .../display/amdgpu_dm/amdgpu_dm_connector.c   | 67
> +++++++++++++++++++
> >  2 files changed, 75 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > index ccf882a22a57..223b562f7005 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > @@ -5781,6 +5781,14 @@ STATIC_IFN_KUNIT void
> get_freesync_config_for_crtc(
> >     }
> >  out:
> >     new_crtc_state->freesync_config = config;
> > +
> > +   drm_dbg_driver(new_con_state->base.connector->dev,
> > +                  "VRR: cfg vrr_enabled=%d vrr_supported=%d
> fs_capable=%d vrefresh=%d min=%d max=%d state=%d\n",
> > +                  new_crtc_state->base.vrr_enabled,
> > +                  new_crtc_state->vrr_supported,
> > +                  new_con_state->freesync_capable, vrefresh,
> > +                  aconnector->min_vfreq, aconnector->max_vfreq,
> > +                  config.state);
> >  }
> >  EXPORT_IF_KUNIT(get_freesync_config_for_crtc);
> >
> > diff --git
> > a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> > index 2deb5abae264..ebead39939a6 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> > +++
> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> > @@ -3605,6 +3605,15 @@ void amdgpu_dm_update_freesync_caps(struct
> drm_connector *connector,
> >     if (!adev->dm.freesync_module || !dc_supports_vrr(sink->ctx-
> >dce_version))
> >             goto update;
> >
> > +   drm_dbg_driver(adev_to_drm(adev),
> > +                  "VRR: enter signal=%d hdmi_vrr=%d mrange[%d-%d]
> hdmi.vrr_cap[sup=%d min=%d max=%d]\n",
> > +                  sink->sink_signal, connector-
> >display_info.hdmi.vrr_cap.supported,
> > +                  connector->display_info.monitor_range.min_vfreq,
> > +                  connector->display_info.monitor_range.max_vfreq,
> > +                  connector->display_info.hdmi.vrr_cap.supported,
> > +                  connector->display_info.hdmi.vrr_cap.vrr_min,
> > +                  connector->display_info.hdmi.vrr_cap.vrr_max);
> > +
> >     /* FIXME: Get rid of drm_edid_raw() */
> >     edid = drm_edid_raw(drm_edid);
> >
> > @@ -3649,6 +3658,59 @@ void amdgpu_dm_update_freesync_caps(struct
> drm_connector *connector,
> >                             connector-
> >display_info.monitor_range.max_vfreq = vsdb_info.max_refresh_rate_hz;
> >                     }
> >             }
> > +
> > +           drm_dbg_driver(adev_to_drm(adev),
> > +                          "VRR: amd_vsdb i=%d fs_sup=%d min=%d
> max=%d fs_capable=%d\n",
> > +                          i, vsdb_info.freesync_supported,
> > +                          vsdb_info.min_refresh_rate_hz,
> > +                          vsdb_info.max_refresh_rate_hz,
> freesync_capable);
> > +
> > +           /*
> > +            * If AMD VSDB didn't provide a valid FreeSync range, fall back
> to
> > +            * the HDMI 2.1 VRR capability parsed from the HF-VSDB.
> > +            */
> > +           if (!freesync_capable && connector-
> >display_info.hdmi.vrr_cap.supported) {
> > +                   struct drm_hdmi_vrr_cap *vrr_cap =
> > +                           &connector->display_info.hdmi.vrr_cap;
> > +
> > +                   drm_dbg_driver(adev_to_drm(adev),
> > +                                  "VRR: HF-VSDB fallback: hdmi_vrr=1
> vrr_cap[sup=%d min=%d max=%d] mrange_max=%d\n",
> > +                                  vrr_cap->supported, vrr_cap->vrr_min,
> vrr_cap->vrr_max,
> > +                                  connector-
> >display_info.monitor_range.max_vfreq);
> > +
> > +                   if (vrr_cap->supported && vrr_cap->vrr_min > 0) {
> > +                           amdgpu_dm_connector->min_vfreq =
> vrr_cap->vrr_min;
> > +                           amdgpu_dm_connector->max_vfreq =
> vrr_cap->vrr_max ?
> > +                                   vrr_cap->vrr_max :
> > +                                   connector-
> >display_info.monitor_range.max_vfreq;
> > +
> > +                           /*
> > +                            * VRRMAX = 0 in the HF-VSDB means "up to
> the Base
> > +                            * Refresh Rate". If the EDID also did not
> provide a
> > +                            * monitor range max, fall back to the Base
> Refresh
> > +                            * Rate (the highest refresh rate of the
> preferred
> > +                            * timing) so a valid VRR range is still reported
> to
> > +                            * userspace.
> > +                            */
> > +                           if (!amdgpu_dm_connector->max_vfreq) {
> > +                                   struct drm_display_mode *brr_mode
> =
>
> Should this be `vrr_mode`?
>
> With that fixed this is
> Reviewed-by: Harry Wentland <[email protected]>
>
> Harry

It stands for "Base Refresh Rate". So it is the right phrase here.

>
> > +
>       amdgpu_dm_get_highest_refresh_rate_mode(amdgpu_dm_connect
> or,
> > +true);
> > +
> > +                                   if (brr_mode)
> > +                                           amdgpu_dm_connector-
> >max_vfreq =
> > +
>       drm_mode_vrefresh(brr_mode);
> > +                           }
> > +
> > +                           if (amdgpu_dm_connector->max_vfreq -
> > +                               amdgpu_dm_connector->min_vfreq > 10)
> > +                                   freesync_capable = true;
> > +
> > +                           connector-
> >display_info.monitor_range.min_vfreq =
> > +                                   amdgpu_dm_connector->min_vfreq;
> > +                           connector-
> >display_info.monitor_range.max_vfreq =
> > +                                   amdgpu_dm_connector->max_vfreq;
> > +                   }
> > +           }
> >     }
> >
> >     if (amdgpu_dm_connector->dc_link)
> > @@ -3692,6 +3754,11 @@ void amdgpu_dm_update_freesync_caps(struct
> drm_connector *connector,
> >     if (dm_con_state)
> >             dm_con_state->freesync_capable = freesync_capable;
> >
> > +   drm_dbg_driver(adev_to_drm(adev),
> > +                  "VRR: caps result: freesync_capable=%d min_vfreq=%d
> max_vfreq=%d\n",
> > +                  freesync_capable, amdgpu_dm_connector->min_vfreq,
> > +                  amdgpu_dm_connector->max_vfreq);
> > +
> >     if (connector->state && amdgpu_dm_connector->dc_link
> && !freesync_capable &&
> >         amdgpu_dm_connector->dc_link-
> >replay_settings.config.replay_supported) {
> >
> > amdgpu_dm_connector->dc_link->replay_settings.config.replay_supported
> > = false;