aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_modeset_lock.c
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2014-07-25 11:47:18 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-08-08 11:46:40 -0400
commita6a8bb848d5ca40bc0eb708ddeb23df2b0eca1fb (patch)
tree6d746abb0ea078eab69b3595215fa8c96ff36b99 /drivers/gpu/drm/drm_modeset_lock.c
parent10f637bf292ba501f9b9e9df6dfe21d8fa521fbd (diff)
drm: Move modeset_lock_all helpers to drm_modeset_lock.[hc]
Somehow we've forgotten about this little bit of OCD. Reviewed-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Matt Roper <matthew.d.roper@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/drm_modeset_lock.c')
-rw-r--r--drivers/gpu/drm/drm_modeset_lock.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_modeset_lock.c b/drivers/gpu/drm/drm_modeset_lock.c
index 0dc57d5ecd10..73e6534fd0aa 100644
--- a/drivers/gpu/drm/drm_modeset_lock.c
+++ b/drivers/gpu/drm/drm_modeset_lock.c
@@ -57,6 +57,101 @@
57 57
58 58
59/** 59/**
60 * drm_modeset_lock_all - take all modeset locks
61 * @dev: drm device
62 *
63 * This function takes all modeset locks, suitable where a more fine-grained
64 * scheme isn't (yet) implemented. Locks must be dropped with
65 * drm_modeset_unlock_all.
66 */
67void drm_modeset_lock_all(struct drm_device *dev)
68{
69 struct drm_mode_config *config = &dev->mode_config;
70 struct drm_modeset_acquire_ctx *ctx;
71 int ret;
72
73 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
74 if (WARN_ON(!ctx))
75 return;
76
77 mutex_lock(&config->mutex);
78
79 drm_modeset_acquire_init(ctx, 0);
80
81retry:
82 ret = drm_modeset_lock(&config->connection_mutex, ctx);
83 if (ret)
84 goto fail;
85 ret = drm_modeset_lock_all_crtcs(dev, ctx);
86 if (ret)
87 goto fail;
88
89 WARN_ON(config->acquire_ctx);
90
91 /* now we hold the locks, so now that it is safe, stash the
92 * ctx for drm_modeset_unlock_all():
93 */
94 config->acquire_ctx = ctx;
95
96 drm_warn_on_modeset_not_all_locked(dev);
97
98 return;
99
100fail:
101 if (ret == -EDEADLK) {
102 drm_modeset_backoff(ctx);
103 goto retry;
104 }
105}
106EXPORT_SYMBOL(drm_modeset_lock_all);
107
108/**
109 * drm_modeset_unlock_all - drop all modeset locks
110 * @dev: device
111 *
112 * This function drop all modeset locks taken by drm_modeset_lock_all.
113 */
114void drm_modeset_unlock_all(struct drm_device *dev)
115{
116 struct drm_mode_config *config = &dev->mode_config;
117 struct drm_modeset_acquire_ctx *ctx = config->acquire_ctx;
118
119 if (WARN_ON(!ctx))
120 return;
121
122 config->acquire_ctx = NULL;
123 drm_modeset_drop_locks(ctx);
124 drm_modeset_acquire_fini(ctx);
125
126 kfree(ctx);
127
128 mutex_unlock(&dev->mode_config.mutex);
129}
130EXPORT_SYMBOL(drm_modeset_unlock_all);
131
132/**
133 * drm_warn_on_modeset_not_all_locked - check that all modeset locks are locked
134 * @dev: device
135 *
136 * Useful as a debug assert.
137 */
138void drm_warn_on_modeset_not_all_locked(struct drm_device *dev)
139{
140 struct drm_crtc *crtc;
141
142 /* Locking is currently fubar in the panic handler. */
143 if (oops_in_progress)
144 return;
145
146 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
147 WARN_ON(!drm_modeset_is_locked(&crtc->mutex));
148
149 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
150 WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
151}
152EXPORT_SYMBOL(drm_warn_on_modeset_not_all_locked);
153
154/**
60 * drm_modeset_acquire_init - initialize acquire context 155 * drm_modeset_acquire_init - initialize acquire context
61 * @ctx: the acquire context 156 * @ctx: the acquire context
62 * @flags: for future 157 * @flags: for future