drm: Add explicit acquire ctx handling around ->gamma_set
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 3 Apr 2017 08:33:00 +0000 (10:33 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 6 Apr 2017 08:21:43 +0000 (10:21 +0200)
Just the groundwork to prepare for adding the acquire cxt parameter to
the ->gamma_set hook. Again we need a temporary hack to fill out
mode_config.acquire_ctx until the atomic helpers are switched over.

Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170403083304.9083-12-daniel.vetter@ffwll.ch
drivers/gpu/drm/drm_color_mgmt.c

index a32be59a72d171c0d3c9871bc6f9e1b4f679b06b..e1b4084c3d16b9cd8b40c343e0a5d63c9eea54a8 100644 (file)
@@ -218,28 +218,29 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev,
        struct drm_crtc *crtc;
        void *r_base, *g_base, *b_base;
        int size;
+       struct drm_modeset_acquire_ctx ctx;
        int ret = 0;
 
        if (!drm_core_check_feature(dev, DRIVER_MODESET))
                return -EINVAL;
 
-       drm_modeset_lock_all(dev);
        crtc = drm_crtc_find(dev, crtc_lut->crtc_id);
-       if (!crtc) {
-               ret = -ENOENT;
-               goto out;
-       }
+       if (!crtc)
+               return -ENOENT;
 
-       if (crtc->funcs->gamma_set == NULL) {
-               ret = -ENOSYS;
-               goto out;
-       }
+       if (crtc->funcs->gamma_set == NULL)
+               return -ENOSYS;
 
        /* memcpy into gamma store */
-       if (crtc_lut->gamma_size != crtc->gamma_size) {
-               ret = -EINVAL;
+       if (crtc_lut->gamma_size != crtc->gamma_size)
+               return -EINVAL;
+
+       drm_modeset_acquire_init(&ctx, 0);
+       dev->mode_config.acquire_ctx = &ctx;
+retry:
+       ret = drm_modeset_lock_all_ctx(dev, &ctx);
+       if (ret)
                goto out;
-       }
 
        size = crtc_lut->gamma_size * (sizeof(uint16_t));
        r_base = crtc->gamma_store;
@@ -263,7 +264,13 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev,
        ret = crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, crtc->gamma_size);
 
 out:
-       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;
 
 }