From: Derek Foreman <[email protected]> Query the minimum and maximum VRR vertical rates from EDID.
Signed-off-by: Derek Foreman <[email protected]> Signed-off-by: Nicolas Frattaroli <[email protected]> --- drivers/gpu/drm/drm_edid.c | 26 ++++++++++++++++++++++++++ include/drm/drm_connector.h | 3 +++ 2 files changed, 29 insertions(+) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 3148038747b6..a1494028e0f5 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -6309,6 +6309,25 @@ static void drm_parse_dsc_info(struct drm_hdmi_dsc_cap *hdmi_dsc, hdmi_dsc->total_chunk_kbytes = hf_scds[13] & DRM_EDID_DSC_TOTAL_CHUNK_KBYTES; } +static void drm_parse_vrr_info(struct drm_display_info *info, const u8 *hf_scds) +{ + struct drm_monitor_range_info *range = &info->monitor_range; + const int pld_len = cea_db_payload_len(hf_scds); + + if (pld_len < 10) + return; + + if (!range->min_vfreq) + range->min_vfreq = FIELD_GET(DRM_EDID_VRR_MIN_MASK, hf_scds[9]); + + if (pld_len < 11) + return; + + if (!range->max_vfreq) + range->max_vfreq = (FIELD_GET(DRM_EDID_VRR_MAX_UPPER_MASK, hf_scds[9]) << 8) | + hf_scds[10]; +} + /* Sink Capability Data Structure */ static void drm_parse_hdmi_forum_scds(struct drm_connector *connector, const u8 *hf_scds) @@ -6371,6 +6390,13 @@ static void drm_parse_hdmi_forum_scds(struct drm_connector *connector, dsc_support = true; } + drm_parse_vrr_info(info, hf_scds); + + if (info->monitor_range.min_vfreq > 0) + hdmi->vrr_capable = true; + else + hdmi->vrr_capable = false; + drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HF-VSDB: max TMDS clock: %d KHz, HDMI 2.1 support: %s, DSC 1.2 support: %s\n", connector->base.id, connector->name, diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 2ee7c59329aa..593fbeaffa16 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -380,6 +380,9 @@ struct drm_hdmi_info { /** @dsc_cap: DSC capabilities of the sink */ struct drm_hdmi_dsc_cap dsc_cap; + + /** @vrr_capable: The sink supports variable refresh rate */ + bool vrr_capable; }; /** -- 2.55.0
