diff mbox

drm/atomic: Reject async flips on a disabled pipe

Message ID 1449134559-30973-1-git-send-email-daniel.vetter@ffwll.ch (mailing list archive)
State New, archived
Headers show

Commit Message

Daniel Vetter Dec. 3, 2015, 9:22 a.m. UTC
Two reasons for that:
- This changes aligns atomic with the legacy page flip semantics as
  established by the i915 driver.

- Asking for an async flip on a disabled pipe generally indicates a
  userspace bug. Worst case userspace will busy-loop rendering (since
  flips complete immediately). So better to catch this fast.

Note that we can't do the same for synchronous commits since the
legacy hooks allowed that. And there's probably piles of userspace
code out there which relies on this.

Cc: Daniel Stone <daniels@collabora.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
 drivers/gpu/drm/drm_atomic.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)
diff mbox

Patch

diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 791876e4657c..3c171e9e1cf5 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -1334,12 +1334,25 @@  EXPORT_SYMBOL(drm_atomic_commit);
 int drm_atomic_async_commit(struct drm_atomic_state *state)
 {
 	struct drm_mode_config *config = &state->dev->mode_config;
-	int ret;
+	struct drm_crtc *crtc;
+	struct drm_crtc_state *crtc_state;
+	int i, ret;
 
 	ret = drm_atomic_check_only(state);
 	if (ret)
 		return ret;
 
+	if (!state->allow_modeset) {
+		for_each_crtc_in_state(state, crtc, crtc_state, i) {
+			if (crtc_state->active) {
+				DRM_DEBUG_ATOMIC("[CRTC:%d] requires full modeset\n",
+						 crtc->base.id);
+				return -EINVAL;
+
+			}
+		}
+	}
+
 	DRM_DEBUG_ATOMIC("commiting %p asynchronously\n", state);
 
 	return config->funcs->atomic_commit(state->dev, state, true);