Commit 2ceb585a authored by Daniel Vetter's avatar Daniel Vetter

drm: Add explicit acquire ctx handling around ->set_config

Just the groundwork to have something to feed into ->set_config.
Again we need a temporary hack to still fill out the legacy
ctx in mode_config.acquire_ctx.
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20170322215058.8671-18-daniel.vetter@ffwll.ch
parent d49473a5
...@@ -447,7 +447,8 @@ int drm_mode_getcrtc(struct drm_device *dev, ...@@ -447,7 +447,8 @@ int drm_mode_getcrtc(struct drm_device *dev,
return 0; return 0;
} }
static int __drm_mode_set_config_internal(struct drm_mode_set *set) static int __drm_mode_set_config_internal(struct drm_mode_set *set,
struct drm_modeset_acquire_ctx *ctx)
{ {
struct drm_crtc *crtc = set->crtc; struct drm_crtc *crtc = set->crtc;
struct drm_framebuffer *fb; struct drm_framebuffer *fb;
...@@ -497,7 +498,7 @@ int drm_mode_set_config_internal(struct drm_mode_set *set) ...@@ -497,7 +498,7 @@ int drm_mode_set_config_internal(struct drm_mode_set *set)
{ {
WARN_ON(drm_drv_uses_atomic_modeset(set->crtc->dev)); WARN_ON(drm_drv_uses_atomic_modeset(set->crtc->dev));
return __drm_mode_set_config_internal(set); return __drm_mode_set_config_internal(set, NULL);
} }
EXPORT_SYMBOL(drm_mode_set_config_internal); EXPORT_SYMBOL(drm_mode_set_config_internal);
...@@ -554,6 +555,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -554,6 +555,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
struct drm_display_mode *mode = NULL; struct drm_display_mode *mode = NULL;
struct drm_mode_set set; struct drm_mode_set set;
uint32_t __user *set_connectors_ptr; uint32_t __user *set_connectors_ptr;
struct drm_modeset_acquire_ctx ctx;
int ret; int ret;
int i; int i;
...@@ -567,15 +569,19 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -567,15 +569,19 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
if (crtc_req->x & 0xffff0000 || crtc_req->y & 0xffff0000) if (crtc_req->x & 0xffff0000 || crtc_req->y & 0xffff0000)
return -ERANGE; return -ERANGE;
drm_modeset_lock_all(dev);
crtc = drm_crtc_find(dev, crtc_req->crtc_id); crtc = drm_crtc_find(dev, crtc_req->crtc_id);
if (!crtc) { if (!crtc) {
DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id); DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id);
ret = -ENOENT; return -ENOENT;
goto out;
} }
DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.id, crtc->name); DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.id, crtc->name);
drm_modeset_acquire_init(&ctx, 0);
retry:
ret = drm_modeset_lock_all_ctx(crtc->dev, &ctx);
if (ret)
goto out;
dev->mode_config.acquire_ctx = &ctx;
if (crtc_req->mode_valid) { if (crtc_req->mode_valid) {
/* If we have a mode we need a framebuffer. */ /* If we have a mode we need a framebuffer. */
/* If we pass -1, set the mode with the currently bound fb */ /* If we pass -1, set the mode with the currently bound fb */
...@@ -696,7 +702,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -696,7 +702,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
set.connectors = connector_set; set.connectors = connector_set;
set.num_connectors = crtc_req->count_connectors; set.num_connectors = crtc_req->count_connectors;
set.fb = fb; set.fb = fb;
ret = __drm_mode_set_config_internal(&set); ret = __drm_mode_set_config_internal(&set, &ctx);
out: out:
if (fb) if (fb)
...@@ -710,7 +716,13 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -710,7 +716,13 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
} }
kfree(connector_set); kfree(connector_set);
drm_mode_destroy(dev, mode); drm_mode_destroy(dev, mode);
drm_modeset_unlock_all(dev); if (ret == -EDEADLK) {
drm_modeset_backoff(&ctx);
goto retry;
}
drm_modeset_drop_locks(&ctx);
drm_modeset_acquire_fini(&ctx);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment