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 <[email protected]>
---
 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

Reply via email to