From: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
To: "Xaver Hugl" <xaver.hugl@gmail.com>,
"Vidith Madhu" <vmadhu@nvidia.com>,
"Borah, Chaitanya Kumar" <chaitanya.kumar.borah@intel.com>,
"Leo Li" <sunpeng.li@amd.com>,
"Harry Wentland" <harry.wentland@amd.com>,
"Fangzhi Zuo" <Jerry.Zuo@amd.com>,
"Daniel Stone" <daniels@collabora.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>, "Helge Deller" <deller@gmx.de>,
"Andrzej Hajda" <andrzej.hajda@intel.com>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Robert Foss" <rfoss@kernel.org>,
"Laurent Pinchart" <Laurent.pinchart@ideasonboard.com>,
"Jonas Karlman" <jonas@kwiboo.se>,
"Jernej Skrabec" <jernej.skrabec@gmail.com>,
"Luca Ceresoli" <luca.ceresoli@bootlin.com>,
"Sandy Huang" <hjc@rock-chips.com>,
"Heiko Stübner" <heiko@sntech.de>, "Andy Yan" <andyshrk@163.com>,
"Michel Dänzer" <michel.daenzer@mailbox.org>
Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
linux-fbdev@vger.kernel.org, linux-rockchip@lists.infradead.org,
linux-arm-kernel@lists.infradead.org, kernel@collabora.com,
Derek Foreman <derek.foreman@collabora.com>,
wayland-devel@lists.freedesktop.org,
Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Subject: [PATCH v2 10/27] drm/connector: Add vrr_display_{min,max} connector properties
Date: Thu, 05 Nov 2026 16:52:01 +0100 [thread overview]
Message-ID: <20261105-vrr-limiter-uapi-v2-10-55f4215be2c2@collabora.com> (raw)
In-Reply-To: <20261105-vrr-limiter-uapi-v2-0-55f4215be2c2@collabora.com>
Depending on whichever quirks a driver applies, what the minimum and
maximum display-supported refresh rates for VRR are is not always
obvious to userspace.
To rectify this, add two new read-only connector properties. These
properties specify the smallest, and respectively the largest, integer
refresh rate in Hertz that the current mode is capable of displaying
with Variable Refresh Rate.
Due to how messy and chicken-and-egg it would be to implement it, this
does not consider the fractional rates below VRR min that might be
allowed, the CinemaVRR rates that might be allowed below VRRmin on HDMI
displays with this feature if userspace ends up presenting fixed rate,
or the QMS range.
Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
---
drivers/gpu/drm/display/drm_hdmi_helper.c | 55 +++++++++++++++++++++++++
drivers/gpu/drm/drm_connector.c | 67 +++++++++++++++++++++++++++++++
include/drm/display/drm_hdmi_helper.h | 3 ++
include/drm/drm_connector.h | 30 ++++++++++++++
4 files changed, 155 insertions(+)
diff --git a/drivers/gpu/drm/display/drm_hdmi_helper.c b/drivers/gpu/drm/display/drm_hdmi_helper.c
index f85cce3d6254..8f325d5e496d 100644
--- a/drivers/gpu/drm/display/drm_hdmi_helper.c
+++ b/drivers/gpu/drm/display/drm_hdmi_helper.c
@@ -730,3 +730,58 @@ int drm_connector_hdmi_sync_scdc(struct drm_connector *connector, bool plugged,
return ret;
}
EXPORT_SYMBOL(drm_connector_hdmi_sync_scdc);
+
+/**
+ * drm_connector_hdmi_update_vrr_limits - update VRR display limit properties
+ * @conn: pointer to the &struct drm_connector to set the properties on
+ * @mode: pointer to the &struct drm_display_mode to consider while updating
+ *
+ * Update the "vrr_display_min" and "vrr_display_max" properties on @conn based
+ * on its HDMI sink info and the current mode. Does not consider any display
+ * protocol other than HDMI.
+ *
+ * Will set both min and max to 0 if max happens to end up below min, which can
+ * happen with CNMVRR==0 and a lower refresh rate @mode.
+ *
+ * Return: %0 on success, negative errno otherwise
+ */
+int drm_connector_hdmi_update_vrr_limits(struct drm_connector *conn,
+ const struct drm_display_mode *mode)
+{
+ struct drm_mode_object *obj = &conn->base;
+ const struct drm_display_info *info;
+ u16 min_hz, max_hz;
+
+ if (!conn->vrr_display_min_property || !conn->vrr_display_max_property)
+ return -ENOENT;
+
+ info = &conn->display_info;
+
+ if (!info->is_hdmi)
+ return -EINVAL;
+
+ if (conn->status != connector_status_connected ||
+ !info->hdmi.vrr_cap.supported) {
+ drm_object_property_set_value(obj, conn->vrr_display_min_property, 0);
+ drm_object_property_set_value(obj, conn->vrr_display_max_property, 0);
+
+ return 0;
+ }
+
+ min_hz = info->hdmi.vrr_cap.vrr_min;
+
+ if (info->hdmi.vrr_cap.cnmvrr)
+ max_hz = info->hdmi.vrr_cap.vrr_max;
+ else
+ max_hz = min(drm_mode_vrefresh(mode), info->hdmi.vrr_cap.vrr_max);
+
+ /* VRR is impossible in the current mode */
+ if (max_hz <= min_hz)
+ min_hz = max_hz = 0;
+
+ drm_object_property_set_value(obj, conn->vrr_display_min_property, min_hz);
+ drm_object_property_set_value(obj, conn->vrr_display_max_property, max_hz);
+
+ return 0;
+}
+EXPORT_SYMBOL(drm_connector_hdmi_update_vrr_limits);
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 33c4195db58b..21222214a843 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -2641,6 +2641,20 @@ EXPORT_SYMBOL(drm_mode_create_scaling_mode_property);
* numerator/denominator pair of a frame rate to set as the maximum VRR
* target rate. If :ref:`VRR_MAX_NUMERATOR <VRR-MAX-NUMERATOR>` is not
* zero, it must be non-zero.
+ *
+ * "vrr_display_min":
+ * Optional &drm_connector property that expresses the lowest integer
+ * frame rate in Hertz that the display can achieve in the current mode
+ * with VRR. It is highly likely the display can represent rational rates
+ * below this value (e.g. 24/1.001), which an atomic test commit with the
+ * limiters set appropriately will reveal. This minimum is assuming
+ * non-constant frame intervals, i.e. does not consider features like
+ * CinemaVRR for HDMI.
+ *
+ * "vrr_display_max":
+ * Optional &drm_connector property that expresses the highest integer
+ * frame rate in Hertz that the display can achieve in the current mode
+ * with VRR.
*/
/**
@@ -2737,6 +2751,59 @@ int drm_connector_attach_vrr_display_mode_property(struct drm_connector *connect
}
EXPORT_SYMBOL(drm_connector_attach_vrr_display_mode_property);
+/**
+ * drm_connector_attach_vrr_display_limits_properties - creates and attaches VRR
+ * display limit properties
+ * @connector: pointer to the &struct drm_connector to attach the properties to
+ *
+ * Creates and attaches the "vrr_display_min" and "vrr_display_max" properties
+ * on @connector. Will either create and attach both, or on failure, neither,
+ * but never just one of the two, unless a connector with just one of the two
+ * already created is passed in.
+ *
+ * Returns:
+ * Zero on success, negative errno on failure
+ */
+int drm_connector_attach_vrr_display_limits_properties(
+ struct drm_connector *connector)
+{
+ struct drm_device *dev = connector->dev;
+ struct drm_property *min_p = NULL, *max_p = NULL;
+
+ if (!connector->vrr_display_min_property) {
+ min_p = drm_property_create_range(dev, DRM_MODE_PROP_IMMUTABLE,
+ "vrr_display_min", 0, U16_MAX);
+
+ if (!min_p)
+ return -ENOMEM;
+ }
+
+ if (!connector->vrr_display_max_property) {
+ max_p = drm_property_create_range(dev, DRM_MODE_PROP_IMMUTABLE,
+ "vrr_display_max", 0, U16_MAX);
+
+ if (!max_p) {
+ if (min_p)
+ drm_property_destroy(dev, min_p);
+
+ return -ENOMEM;
+ }
+ }
+
+ if (min_p) {
+ connector->vrr_display_min_property = min_p;
+ drm_object_attach_property(&connector->base, min_p, 0);
+ }
+
+ if (max_p) {
+ connector->vrr_display_max_property = max_p;
+ drm_object_attach_property(&connector->base, max_p, 0);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(drm_connector_attach_vrr_display_limits_properties);
+
/**
* drm_connector_attach_scaling_mode_property - attach atomic scaling mode property
* @connector: connector to attach scaling mode property on.
diff --git a/include/drm/display/drm_hdmi_helper.h b/include/drm/display/drm_hdmi_helper.h
index 2cdd6e3bc090..dd96885bb592 100644
--- a/include/drm/display/drm_hdmi_helper.h
+++ b/include/drm/display/drm_hdmi_helper.h
@@ -50,4 +50,7 @@ int
drm_connector_hdmi_sync_scdc(struct drm_connector *connector, bool plugged,
struct drm_modeset_acquire_ctx *ctx);
+int drm_connector_hdmi_update_vrr_limits(struct drm_connector *conn,
+ const struct drm_display_mode *mode);
+
#endif
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 5b6920c1a996..c0865a2547fd 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -2495,6 +2495,34 @@ struct drm_connector {
*/
struct drm_property *vrr_display_mode_property;
+ /**
+ * @vrr_display_min_property: Optional read-only property to help
+ * userspace query the minimum supported VRR refresh rate in Hz by the
+ * display.
+ *
+ * Can be attached to a connector by calling
+ * drm_connector_attach_vrr_display_limits_properties().
+ *
+ * Drivers should update it through drm_object_property_set_value()
+ * or through the helper drm_connector_hdmi_update_vrr_limits() for HDMI
+ * connectors using standard HDMI VRR.
+ */
+ struct drm_property *vrr_display_min_property;
+
+ /**
+ * @vrr_display_max_property: Optional read-only property to help
+ * userspace query the maximum supported VRR refresh rate in Hz by the
+ * display.
+ *
+ * Can be attached to a connector by calling
+ * drm_connector_attach_vrr_display_limits_properties().
+ *
+ * Drivers should update it through drm_object_property_set_value()
+ * or through the helper drm_connector_hdmi_update_vrr_limits() for HDMI
+ * connectors using standard HDMI VRR.
+ */
+ struct drm_property *vrr_display_max_property;
+
/**
* @colorspace_property: Connector property to set the suitable
* colorspace supported by the sink.
@@ -2927,6 +2955,8 @@ int drm_connector_attach_vrr_capable_property(
struct drm_connector *connector);
int drm_connector_attach_vrr_display_mode_property(struct drm_connector *connector,
unsigned int supported_vrr_modes);
+int drm_connector_attach_vrr_display_limits_properties(
+ struct drm_connector *connector);
void drm_connector_attach_panel_type_property(struct drm_connector *connector);
int drm_connector_attach_broadcast_rgb_property(struct drm_connector *connector);
int drm_connector_attach_colorspace_property(struct drm_connector *connector);
--
2.56.0
next prev parent reply other threads:[~2026-11-05 15:55 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-05 15:51 [PATCH v2 00/27] VRR Target Rate Limiter KMS uAPI and Implementation Nicolas Frattaroli
2026-11-05 15:51 ` [PATCH v2 01/27] drm: Add VRR state Nicolas Frattaroli
2026-11-05 15:51 ` [PATCH v2 02/27] drm/connector: add vrr_display_mode connector property Nicolas Frattaroli
2026-11-05 15:51 ` [PATCH v2 03/27] video/hdmi: Add VTEM EMP packing Nicolas Frattaroli
2026-11-05 15:51 ` [PATCH v2 04/27] drm/bridge: Add VTEM EMP support Nicolas Frattaroli
2026-11-05 15:51 ` [PATCH v2 05/27] drm/connector: hdmi: Add VTEM EMP generation Nicolas Frattaroli
2026-11-05 15:51 ` [PATCH v2 06/27] drm/crtc-helper: Add VRR helper functions Nicolas Frattaroli
2026-11-05 15:51 ` [PATCH v2 07/27] drm/bridge: synopsys: Add VTEM EMP support Nicolas Frattaroli
2026-11-05 15:51 ` [PATCH v2 08/27] drm/connector: Add drm_display_info_is_vrr_capable Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 09/27] drm: Add VRR target frame rate properties Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli [this message]
2026-11-05 15:52 ` [PATCH v2 11/27] drm: Implement VRR rate limiting Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 12/27] drm/rockchip: dw_hdmi_qp: Add VRR support Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 13/27] drm/rockchip: Set mode_changed on vrr_enabled change Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 14/27] drm/rockchip: vop2: Enable VRR Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 15/27] drm/edid: Parse QMS flag from HDMI SCDS Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 16/27] drm/edid: Parse QMS TFR min/max flags " Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 17/27] drm/connector: Add "Media" VRR display mode for QMS Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 18/27] video/hdmi: Add support for QMS in VTEM EMP packing Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 19/27] drm/connector: hdmi: Add QMS to VTEM EMP generation Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 20/27] drm/connector: hdmi: Add QMS state validation and computation Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 21/27] drm/rockchip: dw_hdmi_qp: Add QMS support Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 22/27] drm/tests: hdmi: Add "Game Mode" VRR tests Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 23/27] drm/tests: hdmi: Add Fixed/Constrained rate " Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 24/27] drm/tests: hdmi: Add Quick Media Switching tests Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 25/27] drm/connector: Fix docs for cnmvrr and cinemavrr members Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 26/27] drm/debugfs: Expose HDMI VRR in vrr_range debugfs Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 27/27] drm/tests: hdmi: Add tests for vrr_display_{min,max} properties Nicolas Frattaroli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261105-vrr-limiter-uapi-v2-10-55f4215be2c2@collabora.com \
--to=nicolas.frattaroli@collabora.com \
--cc=Jerry.Zuo@amd.com \
--cc=Laurent.pinchart@ideasonboard.com \
--cc=airlied@gmail.com \
--cc=andrzej.hajda@intel.com \
--cc=andyshrk@163.com \
--cc=chaitanya.kumar.borah@intel.com \
--cc=daniels@collabora.com \
--cc=deller@gmx.de \
--cc=derek.foreman@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=harry.wentland@amd.com \
--cc=heiko@sntech.de \
--cc=hjc@rock-chips.com \
--cc=jernej.skrabec@gmail.com \
--cc=jonas@kwiboo.se \
--cc=kernel@collabora.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-fbdev@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=luca.ceresoli@bootlin.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=michel.daenzer@mailbox.org \
--cc=mripard@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=rfoss@kernel.org \
--cc=simona@ffwll.ch \
--cc=sunpeng.li@amd.com \
--cc=tzimmermann@suse.de \
--cc=vmadhu@nvidia.com \
--cc=wayland-devel@lists.freedesktop.org \
--cc=xaver.hugl@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®