1*60ded7ccSImre Deak // SPDX-License-Identifier: MIT
2*60ded7ccSImre Deak /*
3*60ded7ccSImre Deak * Copyright © 2023 Intel Corporation
4*60ded7ccSImre Deak */
5*60ded7ccSImre Deak
6*60ded7ccSImre Deak #include <drm/drm_modeset_lock.h>
7*60ded7ccSImre Deak
8*60ded7ccSImre Deak #include "intel_display_types.h"
9*60ded7ccSImre Deak #include "intel_modeset_lock.h"
10*60ded7ccSImre Deak
_intel_modeset_lock_begin(struct drm_modeset_acquire_ctx * ctx,struct intel_atomic_state * state,unsigned int flags,int * ret)11*60ded7ccSImre Deak void _intel_modeset_lock_begin(struct drm_modeset_acquire_ctx *ctx,
12*60ded7ccSImre Deak struct intel_atomic_state *state,
13*60ded7ccSImre Deak unsigned int flags, int *ret)
14*60ded7ccSImre Deak {
15*60ded7ccSImre Deak drm_modeset_acquire_init(ctx, flags);
16*60ded7ccSImre Deak
17*60ded7ccSImre Deak if (state)
18*60ded7ccSImre Deak state->base.acquire_ctx = ctx;
19*60ded7ccSImre Deak
20*60ded7ccSImre Deak *ret = -EDEADLK;
21*60ded7ccSImre Deak }
22*60ded7ccSImre Deak
_intel_modeset_lock_loop(int * ret)23*60ded7ccSImre Deak bool _intel_modeset_lock_loop(int *ret)
24*60ded7ccSImre Deak {
25*60ded7ccSImre Deak if (*ret == -EDEADLK) {
26*60ded7ccSImre Deak *ret = 0;
27*60ded7ccSImre Deak return true;
28*60ded7ccSImre Deak }
29*60ded7ccSImre Deak
30*60ded7ccSImre Deak return false;
31*60ded7ccSImre Deak }
32*60ded7ccSImre Deak
_intel_modeset_lock_end(struct drm_modeset_acquire_ctx * ctx,struct intel_atomic_state * state,int * ret)33*60ded7ccSImre Deak void _intel_modeset_lock_end(struct drm_modeset_acquire_ctx *ctx,
34*60ded7ccSImre Deak struct intel_atomic_state *state,
35*60ded7ccSImre Deak int *ret)
36*60ded7ccSImre Deak {
37*60ded7ccSImre Deak if (*ret == -EDEADLK) {
38*60ded7ccSImre Deak if (state)
39*60ded7ccSImre Deak drm_atomic_state_clear(&state->base);
40*60ded7ccSImre Deak
41*60ded7ccSImre Deak *ret = drm_modeset_backoff(ctx);
42*60ded7ccSImre Deak if (*ret == 0) {
43*60ded7ccSImre Deak *ret = -EDEADLK;
44*60ded7ccSImre Deak return;
45*60ded7ccSImre Deak }
46*60ded7ccSImre Deak }
47*60ded7ccSImre Deak
48*60ded7ccSImre Deak drm_modeset_drop_locks(ctx);
49*60ded7ccSImre Deak drm_modeset_acquire_fini(ctx);
50*60ded7ccSImre Deak }
51