diff options
author | Dave Airlie <airlied@redhat.com> | 2015-01-27 18:34:27 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2015-01-27 18:34:27 -0500 |
commit | 21773f16f2cb3c056051c679da542f0b494252e2 (patch) | |
tree | 362e701c962f8a78978775ff3e4093b490ee0cd1 /drivers/gpu/drm/drm_atomic.c | |
parent | 2f5b4ef15c60bc5292a3f006c018acb3da53737b (diff) | |
parent | 9469244d869623e8b54d9f3d4d00737e377af273 (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.c | 21 |
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 | } |
159 | EXPORT_SYMBOL(drm_atomic_state_clear); | 162 | EXPORT_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; |