aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2017-07-25 08:01:37 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2017-08-08 08:11:53 -0400
commit4a97a3da420b82f967083a31fd80706e56ecabf9 (patch)
tree1b85f49bca3540038906b5d6e6989fdacc2456ac
parent3dfeb631a15db17f187f1e5cc522207f46506611 (diff)
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 8c10342cb48f3140d9abeadcfd2fa6625d447282 (tag: topic/drm-misc-2015-07-28) Author: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> 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 68d3472047a572936551f8ff0b6f4016c5a1fdef Author: Daniel Vetter <daniel.vetter@ffwll.ch> 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 <maarten.lankhorst@linux.intel.com> Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20170725120137.1903-1-daniel.vetter@ffwll.ch
-rw-r--r--drivers/gpu/drm/drm_atomic_helper.c4
-rw-r--r--drivers/gpu/drm/drm_connector.c3
-rw-r--r--drivers/gpu/drm/drm_crtc.c2
-rw-r--r--drivers/gpu/drm/drm_mode_object.c49
-rw-r--r--drivers/gpu/drm/drm_plane.c2
5 files changed, 33 insertions, 27 deletions
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 24a2f172596f..41a8ff3d8b7e 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -921,16 +921,12 @@ drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev,
921 crtc = new_conn_state->crtc; 921 crtc = new_conn_state->crtc;
922 if ((!crtc && old_conn_state->crtc) || 922 if ((!crtc && old_conn_state->crtc) ||
923 (crtc && drm_atomic_crtc_needs_modeset(crtc->state))) { 923 (crtc && drm_atomic_crtc_needs_modeset(crtc->state))) {
924 struct drm_property *dpms_prop =
925 dev->mode_config.dpms_property;
926 int mode = DRM_MODE_DPMS_OFF; 924 int mode = DRM_MODE_DPMS_OFF;
927 925
928 if (crtc && crtc->state->active) 926 if (crtc && crtc->state->active)
929 mode = DRM_MODE_DPMS_ON; 927 mode = DRM_MODE_DPMS_ON;
930 928
931 connector->dpms = mode; 929 connector->dpms = mode;
932 drm_object_property_set_value(&connector->base,
933 dpms_prop, mode);
934 } 930 }
935 } 931 }
936 932
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 8072e6e4c62c..0e9e3161bdd0 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -1225,8 +1225,7 @@ int drm_mode_connector_set_obj_prop(struct drm_mode_object *obj,
1225 } else if (connector->funcs->set_property) 1225 } else if (connector->funcs->set_property)
1226 ret = connector->funcs->set_property(connector, property, value); 1226 ret = connector->funcs->set_property(connector, property, value);
1227 1227
1228 /* store the property value if successful */ 1228 if (!ret && !drm_drv_uses_atomic_modeset(property->dev))
1229 if (!ret)
1230 drm_object_property_set_value(&connector->base, property, value); 1229 drm_object_property_set_value(&connector->base, property, value);
1231 return ret; 1230 return ret;
1232} 1231}
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 5af25ce5bf7c..9271235d84b0 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -736,7 +736,7 @@ int drm_mode_crtc_set_obj_prop(struct drm_mode_object *obj,
736 736
737 if (crtc->funcs->set_property) 737 if (crtc->funcs->set_property)
738 ret = crtc->funcs->set_property(crtc, property, value); 738 ret = crtc->funcs->set_property(crtc, property, value);
739 if (!ret) 739 if (!ret && !drm_drv_uses_atomic_modeset(property->dev))
740 drm_object_property_set_value(obj, property, value); 740 drm_object_property_set_value(obj, property, value);
741 741
742 return ret; 742 return ret;
diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c
index da9a9adbcc98..92743a796bf0 100644
--- a/drivers/gpu/drm/drm_mode_object.c
+++ b/drivers/gpu/drm/drm_mode_object.c
@@ -233,6 +233,9 @@ int drm_object_property_set_value(struct drm_mode_object *obj,
233{ 233{
234 int i; 234 int i;
235 235
236 WARN_ON(drm_drv_uses_atomic_modeset(property->dev) &&
237 !(property->flags & DRM_MODE_PROP_IMMUTABLE));
238
236 for (i = 0; i < obj->properties->count; i++) { 239 for (i = 0; i < obj->properties->count; i++) {
237 if (obj->properties->properties[i] == property) { 240 if (obj->properties->properties[i] == property) {
238 obj->properties->values[i] = val; 241 obj->properties->values[i] = val;
@@ -244,24 +247,7 @@ int drm_object_property_set_value(struct drm_mode_object *obj,
244} 247}
245EXPORT_SYMBOL(drm_object_property_set_value); 248EXPORT_SYMBOL(drm_object_property_set_value);
246 249
247/** 250int __drm_object_property_get_value(struct drm_mode_object *obj,
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 */
264int drm_object_property_get_value(struct drm_mode_object *obj,
265 struct drm_property *property, uint64_t *val) 251 struct drm_property *property, uint64_t *val)
266{ 252{
267 int i; 253 int i;
@@ -284,6 +270,31 @@ int drm_object_property_get_value(struct drm_mode_object *obj,
284 270
285 return -EINVAL; 271 return -EINVAL;
286} 272}
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 */
291int 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}
287EXPORT_SYMBOL(drm_object_property_get_value); 298EXPORT_SYMBOL(drm_object_property_get_value);
288 299
289/* helper for getconnector and getproperties ioctls */ 300/* helper for getconnector and getproperties ioctls */
@@ -302,7 +313,7 @@ int drm_mode_object_get_properties(struct drm_mode_object *obj, bool atomic,
302 continue; 313 continue;
303 314
304 if (*arg_count_props > count) { 315 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);
306 if (ret) 317 if (ret)
307 return ret; 318 return ret;
308 319
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c
index 5c14beee52ff..7889ef7d6954 100644
--- a/drivers/gpu/drm/drm_plane.c
+++ b/drivers/gpu/drm/drm_plane.c
@@ -448,7 +448,7 @@ int drm_mode_plane_set_obj_prop(struct drm_plane *plane,
448 448
449 if (plane->funcs->set_property) 449 if (plane->funcs->set_property)
450 ret = plane->funcs->set_property(plane, property, value); 450 ret = plane->funcs->set_property(plane, property, value);
451 if (!ret) 451 if (!ret && !drm_drv_uses_atomic_modeset(property->dev))
452 drm_object_property_set_value(obj, property, value); 452 drm_object_property_set_value(obj, property, value);
453 453
454 return ret; 454 return ret;