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