diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-07-25 11:47:18 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-08-08 11:46:40 -0400 |
commit | a6a8bb848d5ca40bc0eb708ddeb23df2b0eca1fb (patch) | |
tree | 6d746abb0ea078eab69b3595215fa8c96ff36b99 /drivers/gpu/drm/drm_modeset_lock.c | |
parent | 10f637bf292ba501f9b9e9df6dfe21d8fa521fbd (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.c | 95 |
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 | */ | ||
67 | void 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 | |||
81 | retry: | ||
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 | |||
100 | fail: | ||
101 | if (ret == -EDEADLK) { | ||
102 | drm_modeset_backoff(ctx); | ||
103 | goto retry; | ||
104 | } | ||
105 | } | ||
106 | EXPORT_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 | */ | ||
114 | void 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 | } | ||
130 | EXPORT_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 | */ | ||
138 | void 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 | } | ||
152 | EXPORT_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 |