@@ -77,6 +77,7 @@ drm_atomic_state_init(struct drm_device *dev, struct drm_atomic_state *state)
* setting this appropriately?
*/
state->allow_modeset = true;
+ state->async_update = true;
state->crtcs = kcalloc(dev->mode_config.num_crtc,
sizeof(*state->crtcs), GFP_KERNEL);
@@ -1653,7 +1654,7 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
}
}
- if (state->legacy_cursor_update)
+ if (state->async_update || state->legacy_cursor_update)
state->async_update = drm_atomic_async_check(state);
return ret;
@@ -2189,6 +2190,10 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
(arg->flags & DRM_MODE_PAGE_FLIP_EVENT))
return -EINVAL;
+ if ((arg->flags & DRM_MODE_ATOMIC_ALLOW_MODESET) &&
+ (arg->flags & DRM_MODE_ATOMIC_ASYNC_UPDATE))
+ return -EINVAL;
+
drm_modeset_acquire_init(&ctx, 0);
state = drm_atomic_state_alloc(dev);
@@ -2197,6 +2202,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
state->acquire_ctx = &ctx;
state->allow_modeset = !!(arg->flags & DRM_MODE_ATOMIC_ALLOW_MODESET);
+ state->async_update = !!(arg->flags & DRM_MODE_ATOMIC_ASYNC_UPDATE);
retry:
plane_mask = 0;
@@ -646,13 +646,15 @@ struct drm_mode_destroy_dumb {
#define DRM_MODE_ATOMIC_TEST_ONLY 0x0100
#define DRM_MODE_ATOMIC_NONBLOCK 0x0200
#define DRM_MODE_ATOMIC_ALLOW_MODESET 0x0400
+#define DRM_MODE_ATOMIC_ASYNC_UPDATE 0x0800
#define DRM_MODE_ATOMIC_FLAGS (\
DRM_MODE_PAGE_FLIP_EVENT |\
DRM_MODE_PAGE_FLIP_ASYNC |\
DRM_MODE_ATOMIC_TEST_ONLY |\
DRM_MODE_ATOMIC_NONBLOCK |\
- DRM_MODE_ATOMIC_ALLOW_MODESET)
+ DRM_MODE_ATOMIC_ALLOW_MODESET |\
+ DRM_MODE_ATOMIC_ASYNC_UPDATE)
struct drm_mode_atomic {
__u32 flags;