110be98a7SChris Wilson /*
210be98a7SChris Wilson  * SPDX-License-Identifier: MIT
310be98a7SChris Wilson  *
410be98a7SChris Wilson  * Copyright © 2016 Intel Corporation
510be98a7SChris Wilson  */
610be98a7SChris Wilson 
710be98a7SChris Wilson #ifndef __I915_GEM_CONTEXT_H__
810be98a7SChris Wilson #define __I915_GEM_CONTEXT_H__
910be98a7SChris Wilson 
1010be98a7SChris Wilson #include "i915_gem_context_types.h"
1110be98a7SChris Wilson 
1210be98a7SChris Wilson #include "gt/intel_context.h"
1310be98a7SChris Wilson 
14a4e7ccdaSChris Wilson #include "i915_drv.h"
1510be98a7SChris Wilson #include "i915_gem.h"
1610be98a7SChris Wilson #include "i915_scheduler.h"
1710be98a7SChris Wilson #include "intel_device_info.h"
1810be98a7SChris Wilson 
1910be98a7SChris Wilson struct drm_device;
2010be98a7SChris Wilson struct drm_file;
2110be98a7SChris Wilson 
i915_gem_context_is_closed(const struct i915_gem_context * ctx)2210be98a7SChris Wilson static inline bool i915_gem_context_is_closed(const struct i915_gem_context *ctx)
2310be98a7SChris Wilson {
2410be98a7SChris Wilson 	return test_bit(CONTEXT_CLOSED, &ctx->flags);
2510be98a7SChris Wilson }
2610be98a7SChris Wilson 
i915_gem_context_set_closed(struct i915_gem_context * ctx)2710be98a7SChris Wilson static inline void i915_gem_context_set_closed(struct i915_gem_context *ctx)
2810be98a7SChris Wilson {
2910be98a7SChris Wilson 	GEM_BUG_ON(i915_gem_context_is_closed(ctx));
3010be98a7SChris Wilson 	set_bit(CONTEXT_CLOSED, &ctx->flags);
3110be98a7SChris Wilson }
3210be98a7SChris Wilson 
i915_gem_context_no_error_capture(const struct i915_gem_context * ctx)3310be98a7SChris Wilson static inline bool i915_gem_context_no_error_capture(const struct i915_gem_context *ctx)
3410be98a7SChris Wilson {
3510be98a7SChris Wilson 	return test_bit(UCONTEXT_NO_ERROR_CAPTURE, &ctx->user_flags);
3610be98a7SChris Wilson }
3710be98a7SChris Wilson 
i915_gem_context_set_no_error_capture(struct i915_gem_context * ctx)3810be98a7SChris Wilson static inline void i915_gem_context_set_no_error_capture(struct i915_gem_context *ctx)
3910be98a7SChris Wilson {
4010be98a7SChris Wilson 	set_bit(UCONTEXT_NO_ERROR_CAPTURE, &ctx->user_flags);
4110be98a7SChris Wilson }
4210be98a7SChris Wilson 
i915_gem_context_clear_no_error_capture(struct i915_gem_context * ctx)4310be98a7SChris Wilson static inline void i915_gem_context_clear_no_error_capture(struct i915_gem_context *ctx)
4410be98a7SChris Wilson {
4510be98a7SChris Wilson 	clear_bit(UCONTEXT_NO_ERROR_CAPTURE, &ctx->user_flags);
4610be98a7SChris Wilson }
4710be98a7SChris Wilson 
i915_gem_context_is_bannable(const struct i915_gem_context * ctx)4810be98a7SChris Wilson static inline bool i915_gem_context_is_bannable(const struct i915_gem_context *ctx)
4910be98a7SChris Wilson {
5010be98a7SChris Wilson 	return test_bit(UCONTEXT_BANNABLE, &ctx->user_flags);
5110be98a7SChris Wilson }
5210be98a7SChris Wilson 
i915_gem_context_set_bannable(struct i915_gem_context * ctx)5310be98a7SChris Wilson static inline void i915_gem_context_set_bannable(struct i915_gem_context *ctx)
5410be98a7SChris Wilson {
5510be98a7SChris Wilson 	set_bit(UCONTEXT_BANNABLE, &ctx->user_flags);
5610be98a7SChris Wilson }
5710be98a7SChris Wilson 
i915_gem_context_clear_bannable(struct i915_gem_context * ctx)5810be98a7SChris Wilson static inline void i915_gem_context_clear_bannable(struct i915_gem_context *ctx)
5910be98a7SChris Wilson {
6010be98a7SChris Wilson 	clear_bit(UCONTEXT_BANNABLE, &ctx->user_flags);
6110be98a7SChris Wilson }
6210be98a7SChris Wilson 
i915_gem_context_is_recoverable(const struct i915_gem_context * ctx)6310be98a7SChris Wilson static inline bool i915_gem_context_is_recoverable(const struct i915_gem_context *ctx)
6410be98a7SChris Wilson {
6510be98a7SChris Wilson 	return test_bit(UCONTEXT_RECOVERABLE, &ctx->user_flags);
6610be98a7SChris Wilson }
6710be98a7SChris Wilson 
i915_gem_context_set_recoverable(struct i915_gem_context * ctx)6810be98a7SChris Wilson static inline void i915_gem_context_set_recoverable(struct i915_gem_context *ctx)
6910be98a7SChris Wilson {
7010be98a7SChris Wilson 	set_bit(UCONTEXT_RECOVERABLE, &ctx->user_flags);
7110be98a7SChris Wilson }
7210be98a7SChris Wilson 
i915_gem_context_clear_recoverable(struct i915_gem_context * ctx)7310be98a7SChris Wilson static inline void i915_gem_context_clear_recoverable(struct i915_gem_context *ctx)
7410be98a7SChris Wilson {
7510be98a7SChris Wilson 	clear_bit(UCONTEXT_RECOVERABLE, &ctx->user_flags);
7610be98a7SChris Wilson }
7710be98a7SChris Wilson 
i915_gem_context_is_persistent(const struct i915_gem_context * ctx)78a0e04715SChris Wilson static inline bool i915_gem_context_is_persistent(const struct i915_gem_context *ctx)
79a0e04715SChris Wilson {
80a0e04715SChris Wilson 	return test_bit(UCONTEXT_PERSISTENCE, &ctx->user_flags);
81a0e04715SChris Wilson }
82a0e04715SChris Wilson 
i915_gem_context_set_persistence(struct i915_gem_context * ctx)83a0e04715SChris Wilson static inline void i915_gem_context_set_persistence(struct i915_gem_context *ctx)
84a0e04715SChris Wilson {
85a0e04715SChris Wilson 	set_bit(UCONTEXT_PERSISTENCE, &ctx->user_flags);
86a0e04715SChris Wilson }
87a0e04715SChris Wilson 
i915_gem_context_clear_persistence(struct i915_gem_context * ctx)88a0e04715SChris Wilson static inline void i915_gem_context_clear_persistence(struct i915_gem_context *ctx)
89a0e04715SChris Wilson {
90a0e04715SChris Wilson 	clear_bit(UCONTEXT_PERSISTENCE, &ctx->user_flags);
91a0e04715SChris Wilson }
92a0e04715SChris Wilson 
9310be98a7SChris Wilson static inline bool
i915_gem_context_user_engines(const struct i915_gem_context * ctx)9410be98a7SChris Wilson i915_gem_context_user_engines(const struct i915_gem_context *ctx)
9510be98a7SChris Wilson {
9610be98a7SChris Wilson 	return test_bit(CONTEXT_USER_ENGINES, &ctx->flags);
9710be98a7SChris Wilson }
9810be98a7SChris Wilson 
9910be98a7SChris Wilson static inline void
i915_gem_context_set_user_engines(struct i915_gem_context * ctx)10010be98a7SChris Wilson i915_gem_context_set_user_engines(struct i915_gem_context *ctx)
10110be98a7SChris Wilson {
10210be98a7SChris Wilson 	set_bit(CONTEXT_USER_ENGINES, &ctx->flags);
10310be98a7SChris Wilson }
10410be98a7SChris Wilson 
10510be98a7SChris Wilson static inline void
i915_gem_context_clear_user_engines(struct i915_gem_context * ctx)10610be98a7SChris Wilson i915_gem_context_clear_user_engines(struct i915_gem_context *ctx)
10710be98a7SChris Wilson {
10810be98a7SChris Wilson 	clear_bit(CONTEXT_USER_ENGINES, &ctx->flags);
10910be98a7SChris Wilson }
11010be98a7SChris Wilson 
111d3ac8d42SDaniele Ceraolo Spurio static inline bool
i915_gem_context_uses_protected_content(const struct i915_gem_context * ctx)112d3ac8d42SDaniele Ceraolo Spurio i915_gem_context_uses_protected_content(const struct i915_gem_context *ctx)
113d3ac8d42SDaniele Ceraolo Spurio {
114d3ac8d42SDaniele Ceraolo Spurio 	return ctx->uses_protected_content;
115d3ac8d42SDaniele Ceraolo Spurio }
116d3ac8d42SDaniele Ceraolo Spurio 
11710be98a7SChris Wilson /* i915_gem_context.c */
118e6ba7648SChris Wilson void i915_gem_init__contexts(struct drm_i915_private *i915);
11910be98a7SChris Wilson 
12010be98a7SChris Wilson int i915_gem_context_open(struct drm_i915_private *i915,
12110be98a7SChris Wilson 			  struct drm_file *file);
12210be98a7SChris Wilson void i915_gem_context_close(struct drm_file *file);
12310be98a7SChris Wilson 
12410be98a7SChris Wilson void i915_gem_context_release(struct kref *ctx_ref);
12510be98a7SChris Wilson 
12610be98a7SChris Wilson int i915_gem_vm_create_ioctl(struct drm_device *dev, void *data,
12710be98a7SChris Wilson 			     struct drm_file *file);
12810be98a7SChris Wilson int i915_gem_vm_destroy_ioctl(struct drm_device *dev, void *data,
12910be98a7SChris Wilson 			      struct drm_file *file);
13010be98a7SChris Wilson 
13110be98a7SChris Wilson int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
13210be98a7SChris Wilson 				  struct drm_file *file);
13310be98a7SChris Wilson int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
13410be98a7SChris Wilson 				   struct drm_file *file);
13510be98a7SChris Wilson int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
13610be98a7SChris Wilson 				    struct drm_file *file_priv);
13710be98a7SChris Wilson int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
13810be98a7SChris Wilson 				    struct drm_file *file_priv);
13910be98a7SChris Wilson int i915_gem_context_reset_stats_ioctl(struct drm_device *dev, void *data,
14010be98a7SChris Wilson 				       struct drm_file *file);
14110be98a7SChris Wilson 
142a4c1cdd3SJason Ekstrand struct i915_gem_context *
143a4c1cdd3SJason Ekstrand i915_gem_context_lookup(struct drm_i915_file_private *file_priv, u32 id);
144a4c1cdd3SJason Ekstrand 
14510be98a7SChris Wilson static inline struct i915_gem_context *
i915_gem_context_get(struct i915_gem_context * ctx)14610be98a7SChris Wilson i915_gem_context_get(struct i915_gem_context *ctx)
14710be98a7SChris Wilson {
14810be98a7SChris Wilson 	kref_get(&ctx->ref);
14910be98a7SChris Wilson 	return ctx;
15010be98a7SChris Wilson }
15110be98a7SChris Wilson 
i915_gem_context_put(struct i915_gem_context * ctx)15210be98a7SChris Wilson static inline void i915_gem_context_put(struct i915_gem_context *ctx)
15310be98a7SChris Wilson {
15410be98a7SChris Wilson 	kref_put(&ctx->ref, i915_gem_context_release);
15510be98a7SChris Wilson }
15610be98a7SChris Wilson 
157a4e7ccdaSChris Wilson static inline struct i915_address_space *
i915_gem_context_vm(struct i915_gem_context * ctx)158a4e7ccdaSChris Wilson i915_gem_context_vm(struct i915_gem_context *ctx)
159a4e7ccdaSChris Wilson {
160a4e7ccdaSChris Wilson 	return rcu_dereference_protected(ctx->vm, lockdep_is_held(&ctx->mutex));
161a4e7ccdaSChris Wilson }
162a4e7ccdaSChris Wilson 
i915_gem_context_has_full_ppgtt(struct i915_gem_context * ctx)163a82a9979SDaniel Vetter static inline bool i915_gem_context_has_full_ppgtt(struct i915_gem_context *ctx)
164a82a9979SDaniel Vetter {
1659ec8795eSDaniel Vetter 	GEM_BUG_ON(!!ctx->vm != HAS_FULL_PPGTT(ctx->i915));
166a82a9979SDaniel Vetter 
1679ec8795eSDaniel Vetter 	return !!ctx->vm;
168a82a9979SDaniel Vetter }
169a82a9979SDaniel Vetter 
170a4e7ccdaSChris Wilson static inline struct i915_address_space *
i915_gem_context_get_eb_vm(struct i915_gem_context * ctx)171c6d04e48SDaniel Vetter i915_gem_context_get_eb_vm(struct i915_gem_context *ctx)
172a4e7ccdaSChris Wilson {
173a4e7ccdaSChris Wilson 	struct i915_address_space *vm;
174a4e7ccdaSChris Wilson 
1759ec8795eSDaniel Vetter 	vm = ctx->vm;
176a4e7ccdaSChris Wilson 	if (!vm)
177*5c24c9d2SMichał Winiarski 		vm = &to_gt(ctx->i915)->ggtt->vm;
178a4e7ccdaSChris Wilson 	vm = i915_vm_get(vm);
179a4e7ccdaSChris Wilson 
180a4e7ccdaSChris Wilson 	return vm;
181a4e7ccdaSChris Wilson }
182a4e7ccdaSChris Wilson 
18310be98a7SChris Wilson static inline struct i915_gem_engines *
i915_gem_context_engines(struct i915_gem_context * ctx)18410be98a7SChris Wilson i915_gem_context_engines(struct i915_gem_context *ctx)
18510be98a7SChris Wilson {
18610be98a7SChris Wilson 	return rcu_dereference_protected(ctx->engines,
18710be98a7SChris Wilson 					 lockdep_is_held(&ctx->engines_mutex));
18810be98a7SChris Wilson }
18910be98a7SChris Wilson 
19010be98a7SChris Wilson static inline struct i915_gem_engines *
i915_gem_context_lock_engines(struct i915_gem_context * ctx)19110be98a7SChris Wilson i915_gem_context_lock_engines(struct i915_gem_context *ctx)
19210be98a7SChris Wilson 	__acquires(&ctx->engines_mutex)
19310be98a7SChris Wilson {
19410be98a7SChris Wilson 	mutex_lock(&ctx->engines_mutex);
19510be98a7SChris Wilson 	return i915_gem_context_engines(ctx);
19610be98a7SChris Wilson }
19710be98a7SChris Wilson 
19810be98a7SChris Wilson static inline void
i915_gem_context_unlock_engines(struct i915_gem_context * ctx)19910be98a7SChris Wilson i915_gem_context_unlock_engines(struct i915_gem_context *ctx)
20010be98a7SChris Wilson 	__releases(&ctx->engines_mutex)
20110be98a7SChris Wilson {
20210be98a7SChris Wilson 	mutex_unlock(&ctx->engines_mutex);
20310be98a7SChris Wilson }
20410be98a7SChris Wilson 
20510be98a7SChris Wilson static inline struct intel_context *
i915_gem_context_get_engine(struct i915_gem_context * ctx,unsigned int idx)20610be98a7SChris Wilson i915_gem_context_get_engine(struct i915_gem_context *ctx, unsigned int idx)
20710be98a7SChris Wilson {
208a22f3478SChris Wilson 	struct intel_context *ce;
20910be98a7SChris Wilson 
21010be98a7SChris Wilson 	rcu_read_lock(); {
21110be98a7SChris Wilson 		struct i915_gem_engines *e = rcu_dereference(ctx->engines);
212a22f3478SChris Wilson 		if (unlikely(!e)) /* context was closed! */
213a22f3478SChris Wilson 			ce = ERR_PTR(-ENOENT);
214a22f3478SChris Wilson 		else if (likely(idx < e->num_engines && e->engines[idx]))
21510be98a7SChris Wilson 			ce = intel_context_get(e->engines[idx]);
216a22f3478SChris Wilson 		else
217a22f3478SChris Wilson 			ce = ERR_PTR(-EINVAL);
21810be98a7SChris Wilson 	} rcu_read_unlock();
21910be98a7SChris Wilson 
22010be98a7SChris Wilson 	return ce;
22110be98a7SChris Wilson }
22210be98a7SChris Wilson 
22310be98a7SChris Wilson static inline void
i915_gem_engines_iter_init(struct i915_gem_engines_iter * it,struct i915_gem_engines * engines)22410be98a7SChris Wilson i915_gem_engines_iter_init(struct i915_gem_engines_iter *it,
22510be98a7SChris Wilson 			   struct i915_gem_engines *engines)
22610be98a7SChris Wilson {
22710be98a7SChris Wilson 	it->engines = engines;
22810be98a7SChris Wilson 	it->idx = 0;
22910be98a7SChris Wilson }
23010be98a7SChris Wilson 
23110be98a7SChris Wilson struct intel_context *
23210be98a7SChris Wilson i915_gem_engines_iter_next(struct i915_gem_engines_iter *it);
23310be98a7SChris Wilson 
23410be98a7SChris Wilson #define for_each_gem_engine(ce, engines, it) \
23510be98a7SChris Wilson 	for (i915_gem_engines_iter_init(&(it), (engines)); \
23610be98a7SChris Wilson 	     ((ce) = i915_gem_engines_iter_next(&(it)));)
23710be98a7SChris Wilson 
238a6270d1dSDaniel Vetter void i915_gem_context_module_exit(void);
239a6270d1dSDaniel Vetter int i915_gem_context_module_init(void);
240a6270d1dSDaniel Vetter 
24110be98a7SChris Wilson struct i915_lut_handle *i915_lut_handle_alloc(void);
24210be98a7SChris Wilson void i915_lut_handle_free(struct i915_lut_handle *lut);
24310be98a7SChris Wilson 
2440b6613c6SVenkata Sandeep Dhanalakota int i915_gem_user_to_context_sseu(struct intel_gt *gt,
24511ecbdddSLionel Landwerlin 				  const struct drm_i915_gem_context_param_sseu *user,
24611ecbdddSLionel Landwerlin 				  struct intel_sseu *context);
24711ecbdddSLionel Landwerlin 
24810be98a7SChris Wilson #endif /* !__I915_GEM_CONTEXT_H__ */
249