}
 EXPORT_SYMBOL(drm_mode_create_scaling_mode_property);
 
+/**
+ * drm_connector_attach_vrr_capable_property - creates the
+ * vrr_capable property
+ * @connector: connector to create the vrr_capable property on.
+ *
+ * This is used by atomic drivers to add support for querying
+ * variable refresh rate capability for a connector.
+ *
+ * Returns:
+ * Zero on success, negative errono on failure.
+ */
+int drm_connector_attach_vrr_capable_property(
+       struct drm_connector *connector)
+{
+       struct drm_device *dev = connector->dev;
+       struct drm_property *prop;
+
+       if (!connector->vrr_capable_property) {
+               prop = drm_property_create_bool(dev, DRM_MODE_PROP_IMMUTABLE,
+                       "vrr_capable");
+               if (!prop)
+                       return -ENOMEM;
+
+               connector->vrr_capable_property = prop;
+               drm_object_attach_property(&connector->base, prop, 0);
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(drm_connector_attach_vrr_capable_property);
+
 /**
  * drm_connector_attach_scaling_mode_property - attach atomic scaling mode property
  * @connector: connector to attach scaling mode property on.
 }
 EXPORT_SYMBOL(drm_connector_set_link_status_property);
 
+/**
+ * drm_connector_set_vrr_capable_property - sets the variable refresh rate
+ * capable property for a connector
+ * @connector: drm connector
+ * @capable: True if the connector is variable refresh rate capable
+ *
+ * Should be used by atomic drivers to update the indicated support for
+ * variable refresh rate over a connector.
+ */
+void drm_connector_set_vrr_capable_property(
+               struct drm_connector *connector, bool capable)
+{
+       drm_object_property_set_value(&connector->base,
+                                     connector->vrr_capable_property,
+                                     capable);
+}
+EXPORT_SYMBOL(drm_connector_set_vrr_capable_property);
+
 /**
  * drm_connector_init_panel_orientation_property -
  *     initialize the connecters panel_orientation property
 
         */
        struct drm_property *scaling_mode_property;
 
+       /**
+        * @vrr_capable_property: Optional property to help userspace
+        * query hardware support for variable refresh rate on a connector.
+        * connector. Drivers can add the property to a connector by
+        * calling drm_connector_attach_vrr_capable_property().
+        *
+        * This should be updated only by calling
+        * drm_connector_set_vrr_capable_property().
+        */
+       struct drm_property *vrr_capable_property;
+
        /**
         * @content_protection_property: DRM ENUM property for content
         * protection. See drm_connector_attach_content_protection_property().
 int drm_connector_attach_content_type_property(struct drm_connector *dev);
 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_content_protection_property(
                struct drm_connector *connector);
 int drm_mode_create_aspect_ratio_property(struct drm_device *dev);
                                       const struct edid *edid);
 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);
 int drm_connector_init_panel_orientation_property(
        struct drm_connector *connector, int width, int height);