| // SPDX-License-Identifier: MIT |
| /* |
| * Copyright © 2023 Intel Corporation |
| */ |
| |
| #include <drm/drm_modeset_lock.h> |
| |
| #include "intel_display_types.h" |
| #include "intel_modeset_lock.h" |
| |
| void _intel_modeset_lock_begin(struct drm_modeset_acquire_ctx *ctx, |
| struct intel_atomic_state *state, |
| unsigned int flags, int *ret) |
| { |
| drm_modeset_acquire_init(ctx, flags); |
| |
| if (state) |
| state->base.acquire_ctx = ctx; |
| |
| *ret = -EDEADLK; |
| } |
| |
| bool _intel_modeset_lock_loop(int *ret) |
| { |
| if (*ret == -EDEADLK) { |
| *ret = 0; |
| return true; |
| } |
| |
| return false; |
| } |
| |
| void _intel_modeset_lock_end(struct drm_modeset_acquire_ctx *ctx, |
| struct intel_atomic_state *state, |
| int *ret) |
| { |
| if (*ret == -EDEADLK) { |
| if (state) |
| drm_atomic_state_clear(&state->base); |
| |
| *ret = drm_modeset_backoff(ctx); |
| if (*ret == 0) { |
| *ret = -EDEADLK; |
| return; |
| } |
| } |
| |
| drm_modeset_drop_locks(ctx); |
| drm_modeset_acquire_fini(ctx); |
| } |