[PATCH RFC 01/25] drm/edid: Add a query for vrr range

From: Nicolas Frattaroli

Date: Mon Sep 21 2026 - 12:44:24 EST


From: Derek Foreman <derek.foreman@xxxxxxxxxxxxx>

Query the minimum and maximum VRR vertical rates from EDID.

Signed-off-by: Derek Foreman <derek.foreman@xxxxxxxxxxxxx>
Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@xxxxxxxxxxxxx>
---
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