Skip to content

Commit 4a97a3d

Browse files
committed
drm: Don't update property values for atomic drivers
Atomic drivers only use the property value store for immutable (i.e. can't be set by userspace, but the kernel can still adjust it) properties. The only tricky part is the removal of the update in drm_atomic_helper_update_legacy_modeset_state(). This was added in commit 8c10342 (tag: topic/drm-misc-2015-07-28) Author: Maarten Lankhorst <[email protected]> Date: Mon Jul 27 13:24:29 2015 +0200 drm/atomic: Update legacy DPMS state during modesets, v3. by copying it from the i915 code, where it was originally added in commit 68d3472 Author: Daniel Vetter <[email protected]> Date: Thu Sep 6 22:08:35 2012 +0200 drm/i915: update dpms property in set_mode for the legacy modeset code. The reason we needed this hack was that i915 didn't yet set DRIVER_ATOMIC, and we checked for that instead of the newer-ish drm_drv_uses_atomic_modeset(), which avoids such troubles. With the correct feature checks this isn't needed anymore at all. Also make sure that drivers don't accidentally get this wrong by making the exported version of drm_object_property_get_value() only work for legacy drivers. Only gma500 uses it anyway. v2: Fixup the uses_atomic_modeset() checks (Maarten) Cc: Maarten Lankhorst <[email protected]> Reviewed-by: Maarten Lankhorst <[email protected]> Signed-off-by: Daniel Vetter <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 3dfeb63 commit 4a97a3d

File tree

5 files changed

+33
-27
lines changed

5 files changed

+33
-27
lines changed

drivers/gpu/drm/drm_atomic_helper.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -921,16 +921,12 @@ drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev,
921921
crtc = new_conn_state->crtc;
922922
if ((!crtc && old_conn_state->crtc) ||
923923
(crtc && drm_atomic_crtc_needs_modeset(crtc->state))) {
924-
struct drm_property *dpms_prop =
925-
dev->mode_config.dpms_property;
926924
int mode = DRM_MODE_DPMS_OFF;
927925

928926
if (crtc && crtc->state->active)
929927
mode = DRM_MODE_DPMS_ON;
930928

931929
connector->dpms = mode;
932-
drm_object_property_set_value(&connector->base,
933-
dpms_prop, mode);
934930
}
935931
}
936932

drivers/gpu/drm/drm_connector.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,8 +1225,7 @@ int drm_mode_connector_set_obj_prop(struct drm_mode_object *obj,
12251225
} else if (connector->funcs->set_property)
12261226
ret = connector->funcs->set_property(connector, property, value);
12271227

1228-
/* store the property value if successful */
1229-
if (!ret)
1228+
if (!ret && !drm_drv_uses_atomic_modeset(property->dev))
12301229
drm_object_property_set_value(&connector->base, property, value);
12311230
return ret;
12321231
}

drivers/gpu/drm/drm_crtc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,7 @@ int drm_mode_crtc_set_obj_prop(struct drm_mode_object *obj,
736736

737737
if (crtc->funcs->set_property)
738738
ret = crtc->funcs->set_property(crtc, property, value);
739-
if (!ret)
739+
if (!ret && !drm_drv_uses_atomic_modeset(property->dev))
740740
drm_object_property_set_value(obj, property, value);
741741

742742
return ret;

drivers/gpu/drm/drm_mode_object.c

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@ int drm_object_property_set_value(struct drm_mode_object *obj,
233233
{
234234
int i;
235235

236+
WARN_ON(drm_drv_uses_atomic_modeset(property->dev) &&
237+
!(property->flags & DRM_MODE_PROP_IMMUTABLE));
238+
236239
for (i = 0; i < obj->properties->count; i++) {
237240
if (obj->properties->properties[i] == property) {
238241
obj->properties->values[i] = val;
@@ -244,24 +247,7 @@ int drm_object_property_set_value(struct drm_mode_object *obj,
244247
}
245248
EXPORT_SYMBOL(drm_object_property_set_value);
246249

247-
/**
248-
* drm_object_property_get_value - retrieve the value of a property
249-
* @obj: drm mode object to get property value from
250-
* @property: property to retrieve
251-
* @val: storage for the property value
252-
*
253-
* This function retrieves the softare state of the given property for the given
254-
* property. Since there is no driver callback to retrieve the current property
255-
* value this might be out of sync with the hardware, depending upon the driver
256-
* and property.
257-
*
258-
* Atomic drivers should never call this function directly, the core will read
259-
* out property values through the various ->atomic_get_property callbacks.
260-
*
261-
* Returns:
262-
* Zero on success, error code on failure.
263-
*/
264-
int drm_object_property_get_value(struct drm_mode_object *obj,
250+
int __drm_object_property_get_value(struct drm_mode_object *obj,
265251
struct drm_property *property, uint64_t *val)
266252
{
267253
int i;
@@ -284,6 +270,31 @@ int drm_object_property_get_value(struct drm_mode_object *obj,
284270

285271
return -EINVAL;
286272
}
273+
274+
/**
275+
* drm_object_property_get_value - retrieve the value of a property
276+
* @obj: drm mode object to get property value from
277+
* @property: property to retrieve
278+
* @val: storage for the property value
279+
*
280+
* This function retrieves the softare state of the given property for the given
281+
* property. Since there is no driver callback to retrieve the current property
282+
* value this might be out of sync with the hardware, depending upon the driver
283+
* and property.
284+
*
285+
* Atomic drivers should never call this function directly, the core will read
286+
* out property values through the various ->atomic_get_property callbacks.
287+
*
288+
* Returns:
289+
* Zero on success, error code on failure.
290+
*/
291+
int drm_object_property_get_value(struct drm_mode_object *obj,
292+
struct drm_property *property, uint64_t *val)
293+
{
294+
WARN_ON(drm_drv_uses_atomic_modeset(property->dev));
295+
296+
return __drm_object_property_get_value(obj, property, val);
297+
}
287298
EXPORT_SYMBOL(drm_object_property_get_value);
288299

289300
/* helper for getconnector and getproperties ioctls */
@@ -302,7 +313,7 @@ int drm_mode_object_get_properties(struct drm_mode_object *obj, bool atomic,
302313
continue;
303314

304315
if (*arg_count_props > count) {
305-
ret = drm_object_property_get_value(obj, prop, &val);
316+
ret = __drm_object_property_get_value(obj, prop, &val);
306317
if (ret)
307318
return ret;
308319

drivers/gpu/drm/drm_plane.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ int drm_mode_plane_set_obj_prop(struct drm_plane *plane,
448448

449449
if (plane->funcs->set_property)
450450
ret = plane->funcs->set_property(plane, property, value);
451-
if (!ret)
451+
if (!ret && !drm_drv_uses_atomic_modeset(property->dev))
452452
drm_object_property_set_value(obj, property, value);
453453

454454
return ret;

0 commit comments

Comments
 (0)