diff options
author | Daniel Stone <daniels@collabora.com> | 2015-05-26 09:36:48 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-05-26 09:50:34 -0400 |
commit | 819364da20fd914aba2fd03e95ee0467286752f5 (patch) | |
tree | 4e3cf5c56d47401a57e30389ae88cc82777770b1 | |
parent | bbe16a40e23a65626904aa22fbfc3240a65d21d1 (diff) |
drm: Add drm_atomic_set_mode_for_crtc
Add a new helper, to be used later for blob property management, that
sets the mode for a CRTC state, as well as updating the CRTC enable/active
state at the same time.
v2: Do not touch active/mode_changed in CRTC state. Document return
value. Remove stray drm_atomic_set_mode_prop_for_crtc declaration.
v3: Remove i915 changes, and leave it directly bashing crtc_state->mode
for the meantime.
Signed-off-by: Daniel Stone <daniels@collabora.com>
Tested-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/drm_atomic.c | 36 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_atomic_helper.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_crtc_helper.c | 5 | ||||
-rw-r--r-- | include/drm/drm_atomic.h | 3 |
4 files changed, 50 insertions, 5 deletions
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 3134f506b762..e749287390a3 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c | |||
@@ -290,6 +290,42 @@ drm_atomic_get_crtc_state(struct drm_atomic_state *state, | |||
290 | EXPORT_SYMBOL(drm_atomic_get_crtc_state); | 290 | EXPORT_SYMBOL(drm_atomic_get_crtc_state); |
291 | 291 | ||
292 | /** | 292 | /** |
293 | * drm_atomic_set_mode_for_crtc - set mode for CRTC | ||
294 | * @state: the CRTC whose incoming state to update | ||
295 | * @mode: kernel-internal mode to use for the CRTC, or NULL to disable | ||
296 | * | ||
297 | * Set a mode (originating from the kernel) on the desired CRTC state. Does | ||
298 | * not change any other state properties, including enable, active, or | ||
299 | * mode_changed. | ||
300 | * | ||
301 | * RETURNS: | ||
302 | * Zero on success, error code on failure. Cannot return -EDEADLK. | ||
303 | */ | ||
304 | int drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state, | ||
305 | struct drm_display_mode *mode) | ||
306 | { | ||
307 | /* Early return for no change. */ | ||
308 | if (mode && memcmp(&state->mode, mode, sizeof(*mode)) == 0) | ||
309 | return 0; | ||
310 | |||
311 | if (mode) { | ||
312 | drm_mode_copy(&state->mode, mode); | ||
313 | state->enable = true; | ||
314 | DRM_DEBUG_ATOMIC("Set [MODE:%s] for CRTC state %p\n", | ||
315 | mode->name, state); | ||
316 | } else { | ||
317 | memset(&state->mode, 0, sizeof(state->mode)); | ||
318 | state->enable = false; | ||
319 | DRM_DEBUG_ATOMIC("Set [NOMODE] for CRTC state %p\n", | ||
320 | state); | ||
321 | } | ||
322 | |||
323 | return 0; | ||
324 | } | ||
325 | EXPORT_SYMBOL(drm_atomic_set_mode_for_crtc); | ||
326 | |||
327 | |||
328 | /** | ||
293 | * drm_atomic_crtc_set_property - set property on CRTC | 329 | * drm_atomic_crtc_set_property - set property on CRTC |
294 | * @crtc: the drm CRTC to set a property on | 330 | * @crtc: the drm CRTC to set a property on |
295 | * @state: the state object to update with the new property value | 331 | * @state: the state object to update with the new property value |
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index a64bacdcf263..e69d4847e237 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c | |||
@@ -1607,7 +1607,10 @@ retry: | |||
1607 | WARN_ON(set->fb); | 1607 | WARN_ON(set->fb); |
1608 | WARN_ON(set->num_connectors); | 1608 | WARN_ON(set->num_connectors); |
1609 | 1609 | ||
1610 | crtc_state->enable = false; | 1610 | ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL); |
1611 | if (ret != 0) | ||
1612 | goto fail; | ||
1613 | |||
1611 | crtc_state->active = false; | 1614 | crtc_state->active = false; |
1612 | 1615 | ||
1613 | ret = drm_atomic_set_crtc_for_plane(primary_state, NULL); | 1616 | ret = drm_atomic_set_crtc_for_plane(primary_state, NULL); |
@@ -1622,9 +1625,11 @@ retry: | |||
1622 | WARN_ON(!set->fb); | 1625 | WARN_ON(!set->fb); |
1623 | WARN_ON(!set->num_connectors); | 1626 | WARN_ON(!set->num_connectors); |
1624 | 1627 | ||
1625 | crtc_state->enable = true; | 1628 | ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode); |
1629 | if (ret != 0) | ||
1630 | goto fail; | ||
1631 | |||
1626 | crtc_state->active = true; | 1632 | crtc_state->active = true; |
1627 | drm_mode_copy(&crtc_state->mode, set->mode); | ||
1628 | 1633 | ||
1629 | ret = drm_atomic_set_crtc_for_plane(primary_state, crtc); | 1634 | ret = drm_atomic_set_crtc_for_plane(primary_state, crtc); |
1630 | if (ret != 0) | 1635 | if (ret != 0) |
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index 9297a61a7c95..393114df88a3 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c | |||
@@ -937,10 +937,11 @@ int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mod | |||
937 | crtc_state->crtc = crtc; | 937 | crtc_state->crtc = crtc; |
938 | } | 938 | } |
939 | 939 | ||
940 | crtc_state->enable = true; | ||
941 | crtc_state->planes_changed = true; | 940 | crtc_state->planes_changed = true; |
942 | crtc_state->mode_changed = true; | 941 | crtc_state->mode_changed = true; |
943 | drm_mode_copy(&crtc_state->mode, mode); | 942 | ret = drm_atomic_set_mode_for_crtc(crtc_state, mode); |
943 | if (ret) | ||
944 | goto out; | ||
944 | drm_mode_copy(&crtc_state->adjusted_mode, adjusted_mode); | 945 | drm_mode_copy(&crtc_state->adjusted_mode, adjusted_mode); |
945 | 946 | ||
946 | if (crtc_funcs->atomic_check) { | 947 | if (crtc_funcs->atomic_check) { |
diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h index e89db0c377ba..1e8c61f23294 100644 --- a/include/drm/drm_atomic.h +++ b/include/drm/drm_atomic.h | |||
@@ -110,6 +110,9 @@ drm_atomic_get_existing_connector_state(struct drm_atomic_state *state, | |||
110 | } | 110 | } |
111 | 111 | ||
112 | int __must_check | 112 | int __must_check |
113 | drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state, | ||
114 | struct drm_display_mode *mode); | ||
115 | int __must_check | ||
113 | drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state, | 116 | drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state, |
114 | struct drm_crtc *crtc); | 117 | struct drm_crtc *crtc); |
115 | void drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state, | 118 | void drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state, |