aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Stone <daniels@collabora.com>2015-05-26 09:36:48 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-05-26 09:50:34 -0400
commit819364da20fd914aba2fd03e95ee0467286752f5 (patch)
tree4e3cf5c56d47401a57e30389ae88cc82777770b1
parentbbe16a40e23a65626904aa22fbfc3240a65d21d1 (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.c36
-rw-r--r--drivers/gpu/drm/drm_atomic_helper.c11
-rw-r--r--drivers/gpu/drm/drm_crtc_helper.c5
-rw-r--r--include/drm/drm_atomic.h3
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,
290EXPORT_SYMBOL(drm_atomic_get_crtc_state); 290EXPORT_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 */
304int 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}
325EXPORT_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
112int __must_check 112int __must_check
113drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state,
114 struct drm_display_mode *mode);
115int __must_check
113drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state, 116drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state,
114 struct drm_crtc *crtc); 117 struct drm_crtc *crtc);
115void drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state, 118void drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state,