[PATCH v4 24/27] drm: Add passive_vrr_capable property to connector
From: Tomasz Pakuła
Date: Mon Feb 16 2026 - 11:49:49 EST
Supplement to the passive_vrr_disabled crtc property
Drivers can add the property to a connector with
drm_connector_attach_passive_vrr_capable_property().
The value should be updated based on driver and hardware capability
by using drm_connector_set_passive_vrr_capable_property().
Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@xxxxxxxxx>
---
drivers/gpu/drm/drm_connector.c | 73 +++++++++++++++++++++++++++++++++
include/drm/drm_connector.h | 15 +++++++
2 files changed, 88 insertions(+)
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 272d6254ea47..5bb38b80e214 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -2346,6 +2346,16 @@ EXPORT_SYMBOL(drm_mode_create_scaling_mode_property);
*
* Absence of the property should indicate absence of support.
*
+ * "passive_vrr_capable":
+ * Optional &drm_connector boolean property that drivers should attach
+ * with drm_connector_attach_passive_vrr_capable_property() on
+ * connectors that could support keeping variable refresh rate signalling
+ * in fixed-refresh rate scenarios like desktop work. Drivers should update
+ * the property value by calling
+ * drm_connector_set_passive_vrr_capable_property().
+ *
+ * Absence of the property should indicate absence of support.
+ *
* "VRR_ENABLED":
* Default &drm_crtc boolean property that notifies the driver that the
* content on the CRTC is suitable for variable refresh rate presentation.
@@ -2364,6 +2374,17 @@ EXPORT_SYMBOL(drm_mode_create_scaling_mode_property);
*
* The driver may place further restrictions within these minimum
* and maximum bounds.
+ *
+ * "PASSIVE_VRR_DISABLED":
+ * Default &drm_crtc boolean property that notifies the driver that the
+ * VRR singalling should be disabled in fixed refresh rate scenarios.
+ * Functionally, psssive vrr works the same as VRR_ENABLED == false
+ * but works around displays blanking (mainly HDMI) that do not support
+ * seamless VRR transitions. Also helps with brightness flickering during
+ * VRR transitions.
+ *
+ * Passive VRR mode is not that useful for DP/eDP sinks where seamless VRR
+ * transitions are enforced by the standard.
*/
/**
@@ -2397,6 +2418,37 @@ int drm_connector_attach_vrr_capable_property(
}
EXPORT_SYMBOL(drm_connector_attach_vrr_capable_property);
+/**
+ * drm_connector_attach_passive_vrr_capable_property - creates the
+ * passive_vrr_capable property
+ * @connector: connector to create the passive_vrr_capable property on.
+ *
+ * This is used by atomic drivers to add support for querying
+ * variable refresh rate on desktop capability for a connector.
+ *
+ * Returns:
+ * Zero on success, negative errno on failure.
+ */
+int drm_connector_attach_passive_vrr_capable_property(
+ struct drm_connector *connector)
+{
+ struct drm_device *dev = connector->dev;
+ struct drm_property *prop;
+
+ if (!connector->passive_vrr_capable_property) {
+ prop = drm_property_create_bool(dev, DRM_MODE_PROP_IMMUTABLE,
+ "passive_vrr_capable");
+ if (!prop)
+ return -ENOMEM;
+
+ connector->passive_vrr_capable_property = prop;
+ drm_object_attach_property(&connector->base, prop, 0);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(drm_connector_attach_passive_vrr_capable_property);
+
/**
* drm_connector_attach_scaling_mode_property - attach atomic scaling mode property
* @connector: connector to attach scaling mode property on.
@@ -2968,6 +3020,27 @@ void drm_connector_set_vrr_capable_property(
}
EXPORT_SYMBOL(drm_connector_set_vrr_capable_property);
+/**
+ * drm_connector_set_passive_vrr_disabled_capable_property - sets the variable refresh
+ * rate on desktop capable property for a connector
+ * @connector: drm connector
+ * @capable: True if the connector is variable refresh rate on desktop capable
+ *
+ * Should be used by atomic drivers to update the indicated support for
+ * variable refresh rate on desktop over a connector.
+ */
+void drm_connector_set_passive_vrr_capable_property(
+ struct drm_connector *connector, bool capable)
+{
+ if (!connector->passive_vrr_capable_property)
+ return;
+
+ drm_object_property_set_value(&connector->base,
+ connector->passive_vrr_capable_property,
+ capable);
+}
+EXPORT_SYMBOL(drm_connector_set_passive_vrr_capable_property);
+
/**
* drm_connector_set_panel_orientation - sets the connector's panel_orientation
* @connector: connector for which to set the panel-orientation property.
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index dab9d5521f41..30dd9737bfe0 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -2101,6 +2101,17 @@ struct drm_connector {
*/
struct drm_property *vrr_capable_property;
+ /**
+ * @passive_vrr_capable_property: Optional property to help userspace
+ * query hardware support for passive variable refresh rate on a
+ * connector. Drivers can add the property to a connector by
+ * calling drm_connector_attach_passive_vrr_capable_property().
+ *
+ * This should be updated only by calling
+ * drm_connector_set_passive_vrr_capable_property().
+ */
+ struct drm_property *passive_vrr_capable_property;
+
/**
* @colorspace_property: Connector property to set the suitable
* colorspace supported by the sink.
@@ -2495,6 +2506,8 @@ int drm_connector_attach_scaling_mode_property(struct drm_connector *connector,
u32 scaling_mode_mask);
int drm_connector_attach_vrr_capable_property(
struct drm_connector *connector);
+int drm_connector_attach_passive_vrr_capable_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);
int drm_connector_attach_hdr_output_metadata_property(struct drm_connector *connector);
@@ -2517,6 +2530,8 @@ void drm_connector_set_link_status_property(struct drm_connector *connector,
uint64_t link_status);
void drm_connector_set_vrr_capable_property(
struct drm_connector *connector, bool capable);
+void drm_connector_set_passive_vrr_capable_property(
+ struct drm_connector *connector, bool capable);
int drm_connector_set_panel_orientation(
struct drm_connector *connector,
enum drm_panel_orientation panel_orientation);
--
2.53.0