110be98a7SChris Wilson /*
210be98a7SChris Wilson  * SPDX-License-Identifier: MIT
310be98a7SChris Wilson  *
410be98a7SChris Wilson  * Copyright © 2016 Intel Corporation
510be98a7SChris Wilson  */
610be98a7SChris Wilson 
710be98a7SChris Wilson #include "mock_context.h"
8a8c9a7f5SChris Wilson #include "selftests/mock_drm.h"
910be98a7SChris Wilson #include "selftests/mock_gtt.h"
1010be98a7SChris Wilson 
1110be98a7SChris Wilson struct i915_gem_context *
1210be98a7SChris Wilson mock_context(struct drm_i915_private *i915,
1310be98a7SChris Wilson 	     const char *name)
1410be98a7SChris Wilson {
1510be98a7SChris Wilson 	struct i915_gem_context *ctx;
1610be98a7SChris Wilson 	struct i915_gem_engines *e;
1710be98a7SChris Wilson 
1810be98a7SChris Wilson 	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
1910be98a7SChris Wilson 	if (!ctx)
2010be98a7SChris Wilson 		return NULL;
2110be98a7SChris Wilson 
2210be98a7SChris Wilson 	kref_init(&ctx->ref);
2310be98a7SChris Wilson 	INIT_LIST_HEAD(&ctx->link);
2410be98a7SChris Wilson 	ctx->i915 = i915;
2510be98a7SChris Wilson 
26a0e04715SChris Wilson 	i915_gem_context_set_persistence(ctx);
27a0e04715SChris Wilson 
2810be98a7SChris Wilson 	mutex_init(&ctx->engines_mutex);
2910be98a7SChris Wilson 	e = default_engines(ctx);
3010be98a7SChris Wilson 	if (IS_ERR(e))
3110be98a7SChris Wilson 		goto err_free;
3210be98a7SChris Wilson 	RCU_INIT_POINTER(ctx->engines, e);
3310be98a7SChris Wilson 
3410be98a7SChris Wilson 	INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL);
3510be98a7SChris Wilson 	mutex_init(&ctx->mutex);
3610be98a7SChris Wilson 
3710be98a7SChris Wilson 	if (name) {
38ab53497bSChris Wilson 		struct i915_ppgtt *ppgtt;
3910be98a7SChris Wilson 
40fc4f125dSChris Wilson 		strncpy(ctx->name, name, sizeof(ctx->name));
4110be98a7SChris Wilson 
4210be98a7SChris Wilson 		ppgtt = mock_ppgtt(i915, name);
4310be98a7SChris Wilson 		if (!ppgtt)
4410be98a7SChris Wilson 			goto err_put;
4510be98a7SChris Wilson 
46a4e7ccdaSChris Wilson 		mutex_lock(&ctx->mutex);
47e568ac38SChris Wilson 		__set_ppgtt(ctx, &ppgtt->vm);
48a4e7ccdaSChris Wilson 		mutex_unlock(&ctx->mutex);
49a4e7ccdaSChris Wilson 
50e568ac38SChris Wilson 		i915_vm_put(&ppgtt->vm);
5110be98a7SChris Wilson 	}
5210be98a7SChris Wilson 
5310be98a7SChris Wilson 	return ctx;
5410be98a7SChris Wilson 
5510be98a7SChris Wilson err_free:
5610be98a7SChris Wilson 	kfree(ctx);
5710be98a7SChris Wilson 	return NULL;
5810be98a7SChris Wilson 
5910be98a7SChris Wilson err_put:
6010be98a7SChris Wilson 	i915_gem_context_set_closed(ctx);
6110be98a7SChris Wilson 	i915_gem_context_put(ctx);
6210be98a7SChris Wilson 	return NULL;
6310be98a7SChris Wilson }
6410be98a7SChris Wilson 
6510be98a7SChris Wilson void mock_context_close(struct i915_gem_context *ctx)
6610be98a7SChris Wilson {
6710be98a7SChris Wilson 	context_close(ctx);
6810be98a7SChris Wilson }
6910be98a7SChris Wilson 
7010be98a7SChris Wilson void mock_init_contexts(struct drm_i915_private *i915)
7110be98a7SChris Wilson {
72a4e7ccdaSChris Wilson 	init_contexts(&i915->gem.contexts);
7310be98a7SChris Wilson }
7410be98a7SChris Wilson 
7510be98a7SChris Wilson struct i915_gem_context *
76a8c9a7f5SChris Wilson live_context(struct drm_i915_private *i915, struct file *file)
7710be98a7SChris Wilson {
7810be98a7SChris Wilson 	struct i915_gem_context *ctx;
7910be98a7SChris Wilson 	int err;
80c100777cSTvrtko Ursulin 	u32 id;
8110be98a7SChris Wilson 
8210be98a7SChris Wilson 	ctx = i915_gem_create_context(i915, 0);
8310be98a7SChris Wilson 	if (IS_ERR(ctx))
8410be98a7SChris Wilson 		return ctx;
8510be98a7SChris Wilson 
8603d0ed8aSChris Wilson 	i915_gem_context_set_no_error_capture(ctx);
8703d0ed8aSChris Wilson 
88c100777cSTvrtko Ursulin 	err = gem_context_register(ctx, to_drm_file(file)->driver_priv, &id);
8910be98a7SChris Wilson 	if (err < 0)
9010be98a7SChris Wilson 		goto err_ctx;
9110be98a7SChris Wilson 
9210be98a7SChris Wilson 	return ctx;
9310be98a7SChris Wilson 
9410be98a7SChris Wilson err_ctx:
9510be98a7SChris Wilson 	context_close(ctx);
9610be98a7SChris Wilson 	return ERR_PTR(err);
9710be98a7SChris Wilson }
9810be98a7SChris Wilson 
9910be98a7SChris Wilson struct i915_gem_context *
10010be98a7SChris Wilson kernel_context(struct drm_i915_private *i915)
10110be98a7SChris Wilson {
102e6ba7648SChris Wilson 	struct i915_gem_context *ctx;
103e6ba7648SChris Wilson 
104e6ba7648SChris Wilson 	ctx = i915_gem_create_context(i915, 0);
105e6ba7648SChris Wilson 	if (IS_ERR(ctx))
106e6ba7648SChris Wilson 		return ctx;
107e6ba7648SChris Wilson 
108e6ba7648SChris Wilson 	i915_gem_context_clear_bannable(ctx);
109e6ba7648SChris Wilson 	i915_gem_context_set_persistence(ctx);
110e6ba7648SChris Wilson 
111e6ba7648SChris Wilson 	return ctx;
11210be98a7SChris Wilson }
11310be98a7SChris Wilson 
11410be98a7SChris Wilson void kernel_context_close(struct i915_gem_context *ctx)
11510be98a7SChris Wilson {
11610be98a7SChris Wilson 	context_close(ctx);
11710be98a7SChris Wilson }
118