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, |
