Commit 1398958c authored by Nicholas Kazlauskas's avatar Nicholas Kazlauskas Committed by Alex Deucher

drm: Add vrr_enabled property to drm CRTC

This patch introduces the 'vrr_enabled' CRTC property to allow
dynamic control over variable refresh rate support for a CRTC.

This property should be treated like a content hint to the driver -
if the hardware or driver is not capable of driving variable refresh
timings then this is not considered an error.

Capability for variable refresh rate support should be determined
by querying the vrr_capable drm connector property.

It is worth noting that while the property is intended for atomic use
it isn't filtered from legacy userspace queries. This allows for Xorg
userspace drivers to implement support.
Signed-off-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ba1b0f6c
...@@ -433,6 +433,8 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc, ...@@ -433,6 +433,8 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
ret = drm_atomic_set_mode_prop_for_crtc(state, mode); ret = drm_atomic_set_mode_prop_for_crtc(state, mode);
drm_property_blob_put(mode); drm_property_blob_put(mode);
return ret; return ret;
} else if (property == config->prop_vrr_enabled) {
state->vrr_enabled = val;
} else if (property == config->degamma_lut_property) { } else if (property == config->degamma_lut_property) {
ret = drm_atomic_replace_property_blob_from_id(dev, ret = drm_atomic_replace_property_blob_from_id(dev,
&state->degamma_lut, &state->degamma_lut,
...@@ -491,6 +493,8 @@ drm_atomic_crtc_get_property(struct drm_crtc *crtc, ...@@ -491,6 +493,8 @@ drm_atomic_crtc_get_property(struct drm_crtc *crtc,
*val = state->active; *val = state->active;
else if (property == config->prop_mode_id) else if (property == config->prop_mode_id)
*val = (state->mode_blob) ? state->mode_blob->base.id : 0; *val = (state->mode_blob) ? state->mode_blob->base.id : 0;
else if (property == config->prop_vrr_enabled)
*val = state->vrr_enabled;
else if (property == config->degamma_lut_property) else if (property == config->degamma_lut_property)
*val = (state->degamma_lut) ? state->degamma_lut->base.id : 0; *val = (state->degamma_lut) ? state->degamma_lut->base.id : 0;
else if (property == config->ctm_property) else if (property == config->ctm_property)
......
...@@ -340,6 +340,8 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, ...@@ -340,6 +340,8 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc,
drm_object_attach_property(&crtc->base, config->prop_mode_id, 0); drm_object_attach_property(&crtc->base, config->prop_mode_id, 0);
drm_object_attach_property(&crtc->base, drm_object_attach_property(&crtc->base,
config->prop_out_fence_ptr, 0); config->prop_out_fence_ptr, 0);
drm_object_attach_property(&crtc->base,
config->prop_vrr_enabled, 0);
} }
return 0; return 0;
......
...@@ -310,6 +310,12 @@ static int drm_mode_create_standard_properties(struct drm_device *dev) ...@@ -310,6 +310,12 @@ static int drm_mode_create_standard_properties(struct drm_device *dev)
return -ENOMEM; return -ENOMEM;
dev->mode_config.prop_mode_id = prop; dev->mode_config.prop_mode_id = prop;
prop = drm_property_create_bool(dev, 0,
"VRR_ENABLED");
if (!prop)
return -ENOMEM;
dev->mode_config.prop_vrr_enabled = prop;
prop = drm_property_create(dev, prop = drm_property_create(dev,
DRM_MODE_PROP_BLOB, DRM_MODE_PROP_BLOB,
"DEGAMMA_LUT", 0); "DEGAMMA_LUT", 0);
......
...@@ -290,6 +290,15 @@ struct drm_crtc_state { ...@@ -290,6 +290,15 @@ struct drm_crtc_state {
*/ */
u32 pageflip_flags; u32 pageflip_flags;
/**
* @vrr_enabled:
*
* Indicates if variable refresh rate should be enabled for the CRTC.
* Support for the requested vrr state will depend on driver and
* hardware capabiltiy - lacking support is not treated as failure.
*/
bool vrr_enabled;
/** /**
* @event: * @event:
* *
......
...@@ -645,6 +645,11 @@ struct drm_mode_config { ...@@ -645,6 +645,11 @@ struct drm_mode_config {
* connectors must be of and active must be set to disabled, too. * connectors must be of and active must be set to disabled, too.
*/ */
struct drm_property *prop_mode_id; struct drm_property *prop_mode_id;
/**
* @prop_vrr_enabled: Default atomic CRTC property to indicate
* whether variable refresh rate should be enabled on the CRTC.
*/
struct drm_property *prop_vrr_enabled;
/** /**
* @dvi_i_subconnector_property: Optional DVI-I property to * @dvi_i_subconnector_property: Optional DVI-I property to
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment