|
@@ -1296,14 +1296,39 @@ EXPORT_SYMBOL(drm_atomic_add_affected_planes);
|
|
*/
|
|
*/
|
|
void drm_atomic_legacy_backoff(struct drm_atomic_state *state)
|
|
void drm_atomic_legacy_backoff(struct drm_atomic_state *state)
|
|
{
|
|
{
|
|
|
|
+ struct drm_device *dev = state->dev;
|
|
|
|
+ unsigned crtc_mask = 0;
|
|
|
|
+ struct drm_crtc *crtc;
|
|
int ret;
|
|
int ret;
|
|
|
|
+ bool global = false;
|
|
|
|
+
|
|
|
|
+ drm_for_each_crtc(crtc, dev) {
|
|
|
|
+ if (crtc->acquire_ctx != state->acquire_ctx)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ crtc_mask |= drm_crtc_mask(crtc);
|
|
|
|
+ crtc->acquire_ctx = NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (WARN_ON(dev->mode_config.acquire_ctx == state->acquire_ctx)) {
|
|
|
|
+ global = true;
|
|
|
|
+
|
|
|
|
+ dev->mode_config.acquire_ctx = NULL;
|
|
|
|
+ }
|
|
|
|
|
|
retry:
|
|
retry:
|
|
drm_modeset_backoff(state->acquire_ctx);
|
|
drm_modeset_backoff(state->acquire_ctx);
|
|
|
|
|
|
- ret = drm_modeset_lock_all_ctx(state->dev, state->acquire_ctx);
|
|
|
|
|
|
+ ret = drm_modeset_lock_all_ctx(dev, state->acquire_ctx);
|
|
if (ret)
|
|
if (ret)
|
|
goto retry;
|
|
goto retry;
|
|
|
|
+
|
|
|
|
+ drm_for_each_crtc(crtc, dev)
|
|
|
|
+ if (drm_crtc_mask(crtc) & crtc_mask)
|
|
|
|
+ crtc->acquire_ctx = state->acquire_ctx;
|
|
|
|
+
|
|
|
|
+ if (global)
|
|
|
|
+ dev->mode_config.acquire_ctx = state->acquire_ctx;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(drm_atomic_legacy_backoff);
|
|
EXPORT_SYMBOL(drm_atomic_legacy_backoff);
|
|
|
|
|