|
@@ -45,101 +45,6 @@ static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev,
|
|
|
struct drm_mode_fb_cmd2 *r,
|
|
|
struct drm_file *file_priv);
|
|
|
|
|
|
-/**
|
|
|
- * drm_modeset_lock_all - take all modeset locks
|
|
|
- * @dev: drm device
|
|
|
- *
|
|
|
- * This function takes all modeset locks, suitable where a more fine-grained
|
|
|
- * scheme isn't (yet) implemented. Locks must be dropped with
|
|
|
- * drm_modeset_unlock_all.
|
|
|
- */
|
|
|
-void drm_modeset_lock_all(struct drm_device *dev)
|
|
|
-{
|
|
|
- struct drm_mode_config *config = &dev->mode_config;
|
|
|
- struct drm_modeset_acquire_ctx *ctx;
|
|
|
- int ret;
|
|
|
-
|
|
|
- ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
|
|
|
- if (WARN_ON(!ctx))
|
|
|
- return;
|
|
|
-
|
|
|
- mutex_lock(&config->mutex);
|
|
|
-
|
|
|
- drm_modeset_acquire_init(ctx, 0);
|
|
|
-
|
|
|
-retry:
|
|
|
- ret = drm_modeset_lock(&config->connection_mutex, ctx);
|
|
|
- if (ret)
|
|
|
- goto fail;
|
|
|
- ret = drm_modeset_lock_all_crtcs(dev, ctx);
|
|
|
- if (ret)
|
|
|
- goto fail;
|
|
|
-
|
|
|
- WARN_ON(config->acquire_ctx);
|
|
|
-
|
|
|
- /* now we hold the locks, so now that it is safe, stash the
|
|
|
- * ctx for drm_modeset_unlock_all():
|
|
|
- */
|
|
|
- config->acquire_ctx = ctx;
|
|
|
-
|
|
|
- drm_warn_on_modeset_not_all_locked(dev);
|
|
|
-
|
|
|
- return;
|
|
|
-
|
|
|
-fail:
|
|
|
- if (ret == -EDEADLK) {
|
|
|
- drm_modeset_backoff(ctx);
|
|
|
- goto retry;
|
|
|
- }
|
|
|
-}
|
|
|
-EXPORT_SYMBOL(drm_modeset_lock_all);
|
|
|
-
|
|
|
-/**
|
|
|
- * drm_modeset_unlock_all - drop all modeset locks
|
|
|
- * @dev: device
|
|
|
- *
|
|
|
- * This function drop all modeset locks taken by drm_modeset_lock_all.
|
|
|
- */
|
|
|
-void drm_modeset_unlock_all(struct drm_device *dev)
|
|
|
-{
|
|
|
- struct drm_mode_config *config = &dev->mode_config;
|
|
|
- struct drm_modeset_acquire_ctx *ctx = config->acquire_ctx;
|
|
|
-
|
|
|
- if (WARN_ON(!ctx))
|
|
|
- return;
|
|
|
-
|
|
|
- config->acquire_ctx = NULL;
|
|
|
- drm_modeset_drop_locks(ctx);
|
|
|
- drm_modeset_acquire_fini(ctx);
|
|
|
-
|
|
|
- kfree(ctx);
|
|
|
-
|
|
|
- mutex_unlock(&dev->mode_config.mutex);
|
|
|
-}
|
|
|
-EXPORT_SYMBOL(drm_modeset_unlock_all);
|
|
|
-
|
|
|
-/**
|
|
|
- * drm_warn_on_modeset_not_all_locked - check that all modeset locks are locked
|
|
|
- * @dev: device
|
|
|
- *
|
|
|
- * Useful as a debug assert.
|
|
|
- */
|
|
|
-void drm_warn_on_modeset_not_all_locked(struct drm_device *dev)
|
|
|
-{
|
|
|
- struct drm_crtc *crtc;
|
|
|
-
|
|
|
- /* Locking is currently fubar in the panic handler. */
|
|
|
- if (oops_in_progress)
|
|
|
- return;
|
|
|
-
|
|
|
- list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
|
|
|
- WARN_ON(!drm_modeset_is_locked(&crtc->mutex));
|
|
|
-
|
|
|
- WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
|
|
|
- WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
|
|
|
-}
|
|
|
-EXPORT_SYMBOL(drm_warn_on_modeset_not_all_locked);
|
|
|
-
|
|
|
/* Avoid boilerplate. I'm tired of typing. */
|
|
|
#define DRM_ENUM_NAME_FN(fnname, list) \
|
|
|
const char *fnname(int val) \
|