diff options
Diffstat (limited to 'drivers/gpu')
-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 |
3 files changed, 47 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) { |