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