aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_atomic.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2015-01-27 18:34:27 -0500
committerDave Airlie <airlied@redhat.com>2015-01-27 18:34:27 -0500
commit21773f16f2cb3c056051c679da542f0b494252e2 (patch)
tree362e701c962f8a78978775ff3e4093b490ee0cd1 /drivers/gpu/drm/drm_atomic.c
parent2f5b4ef15c60bc5292a3f006c018acb3da53737b (diff)
parent9469244d869623e8b54d9f3d4d00737e377af273 (diff)
Merge tag 'topic/atomic-core-2015-01-27' of git://anongit.freedesktop.org/drm-intel into drm-next
* tag 'topic/atomic-core-2015-01-27' of git://anongit.freedesktop.org/drm-intel: drm/atomic: Fix potential use of state after free drm/atomic-helper: debug output for modesets drm/atomic-helpers: Saner encoder/crtc callbacks drm/atomic-helpers: Recover full cursor plane behaviour drm/atomic-helper: add connector->dpms() implementation drm/atomic: Add drm_crtc_state->active drm: Add standardized boolean props drm/plane-helper: Fix transitional helper kerneldocs drm/plane-helper: Skip prepare_fb/cleanup_fb when newfb==oldfb Conflicts: include/drm/drm_crtc_helper.h
Diffstat (limited to 'drivers/gpu/drm/drm_atomic.c')
-rw-r--r--drivers/gpu/drm/drm_atomic.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 4c5c9c3899e0..c2e9c5283136 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -134,6 +134,7 @@ void drm_atomic_state_clear(struct drm_atomic_state *state)
134 134
135 connector->funcs->atomic_destroy_state(connector, 135 connector->funcs->atomic_destroy_state(connector,
136 state->connector_states[i]); 136 state->connector_states[i]);
137 state->connector_states[i] = NULL;
137 } 138 }
138 139
139 for (i = 0; i < config->num_crtc; i++) { 140 for (i = 0; i < config->num_crtc; i++) {
@@ -144,6 +145,7 @@ void drm_atomic_state_clear(struct drm_atomic_state *state)
144 145
145 crtc->funcs->atomic_destroy_state(crtc, 146 crtc->funcs->atomic_destroy_state(crtc,
146 state->crtc_states[i]); 147 state->crtc_states[i]);
148 state->crtc_states[i] = NULL;
147 } 149 }
148 150
149 for (i = 0; i < config->num_total_plane; i++) { 151 for (i = 0; i < config->num_total_plane; i++) {
@@ -154,6 +156,7 @@ void drm_atomic_state_clear(struct drm_atomic_state *state)
154 156
155 plane->funcs->atomic_destroy_state(plane, 157 plane->funcs->atomic_destroy_state(plane,
156 state->plane_states[i]); 158 state->plane_states[i]);
159 state->plane_states[i] = NULL;
157 } 160 }
158} 161}
159EXPORT_SYMBOL(drm_atomic_state_clear); 162EXPORT_SYMBOL(drm_atomic_state_clear);
@@ -241,7 +244,13 @@ int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
241 struct drm_crtc_state *state, struct drm_property *property, 244 struct drm_crtc_state *state, struct drm_property *property,
242 uint64_t val) 245 uint64_t val)
243{ 246{
244 if (crtc->funcs->atomic_set_property) 247 struct drm_device *dev = crtc->dev;
248 struct drm_mode_config *config = &dev->mode_config;
249
250 /* FIXME: Mode prop is missing, which also controls ->enable. */
251 if (property == config->prop_active) {
252 state->active = val;
253 } else if (crtc->funcs->atomic_set_property)
245 return crtc->funcs->atomic_set_property(crtc, state, property, val); 254 return crtc->funcs->atomic_set_property(crtc, state, property, val);
246 return -EINVAL; 255 return -EINVAL;
247} 256}
@@ -282,6 +291,13 @@ static int drm_atomic_crtc_check(struct drm_crtc *crtc,
282 * 291 *
283 * TODO: Add generic modeset state checks once we support those. 292 * TODO: Add generic modeset state checks once we support those.
284 */ 293 */
294
295 if (state->active && !state->enable) {
296 DRM_DEBUG_KMS("[CRTC:%d] active without enabled\n",
297 crtc->base.id);
298 return -EINVAL;
299 }
300
285 return 0; 301 return 0;
286} 302}
287 303
@@ -978,7 +994,8 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
978 if (!crtc) 994 if (!crtc)
979 continue; 995 continue;
980 996
981 if (crtc_state->mode_changed) { 997 if (crtc_state->mode_changed ||
998 crtc_state->active_changed) {
982 DRM_DEBUG_KMS("[CRTC:%d] requires full modeset\n", 999 DRM_DEBUG_KMS("[CRTC:%d] requires full modeset\n",
983 crtc->base.id); 1000 crtc->base.id);
984 return -EINVAL; 1001 return -EINVAL;