xref: /netbsd-src/sys/external/bsd/drm2/dist/drm/i915/gem/selftests/mock_context.c (revision 41ec02673d281bbb3d38e6c78504ce6e30c228c1)
1 /*	$NetBSD: mock_context.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
2 
3 /*
4  * SPDX-License-Identifier: MIT
5  *
6  * Copyright © 2016 Intel Corporation
7  */
8 
9 #include <sys/cdefs.h>
10 __KERNEL_RCSID(0, "$NetBSD: mock_context.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
11 
12 #include "mock_context.h"
13 #include "selftests/mock_drm.h"
14 #include "selftests/mock_gtt.h"
15 
16 struct i915_gem_context *
mock_context(struct drm_i915_private * i915,const char * name)17 mock_context(struct drm_i915_private *i915,
18 	     const char *name)
19 {
20 	struct i915_gem_context *ctx;
21 	struct i915_gem_engines *e;
22 
23 	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
24 	if (!ctx)
25 		return NULL;
26 
27 	kref_init(&ctx->ref);
28 	INIT_LIST_HEAD(&ctx->link);
29 	ctx->i915 = i915;
30 
31 	i915_gem_context_set_persistence(ctx);
32 
33 	mutex_init(&ctx->engines_mutex);
34 	e = default_engines(ctx);
35 	if (IS_ERR(e))
36 		goto err_free;
37 	RCU_INIT_POINTER(ctx->engines, e);
38 
39 	INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL);
40 	mutex_init(&ctx->mutex);
41 
42 	if (name) {
43 		struct i915_ppgtt *ppgtt;
44 
45 		strncpy(ctx->name, name, sizeof(ctx->name));
46 
47 		ppgtt = mock_ppgtt(i915, name);
48 		if (!ppgtt)
49 			goto err_put;
50 
51 		mutex_lock(&ctx->mutex);
52 		__set_ppgtt(ctx, &ppgtt->vm);
53 		mutex_unlock(&ctx->mutex);
54 
55 		i915_vm_put(&ppgtt->vm);
56 	}
57 
58 	return ctx;
59 
60 err_free:
61 	kfree(ctx);
62 	return NULL;
63 
64 err_put:
65 	i915_gem_context_set_closed(ctx);
66 	i915_gem_context_put(ctx);
67 	return NULL;
68 }
69 
mock_context_close(struct i915_gem_context * ctx)70 void mock_context_close(struct i915_gem_context *ctx)
71 {
72 	context_close(ctx);
73 }
74 
mock_init_contexts(struct drm_i915_private * i915)75 void mock_init_contexts(struct drm_i915_private *i915)
76 {
77 	init_contexts(&i915->gem.contexts);
78 }
79 
80 struct i915_gem_context *
live_context(struct drm_i915_private * i915,struct file * file)81 live_context(struct drm_i915_private *i915, struct file *file)
82 {
83 	struct i915_gem_context *ctx;
84 	int err;
85 	u32 id;
86 
87 	ctx = i915_gem_create_context(i915, 0);
88 	if (IS_ERR(ctx))
89 		return ctx;
90 
91 	err = gem_context_register(ctx, to_drm_file(file)->driver_priv, &id);
92 	if (err < 0)
93 		goto err_ctx;
94 
95 	return ctx;
96 
97 err_ctx:
98 	context_close(ctx);
99 	return ERR_PTR(err);
100 }
101 
102 struct i915_gem_context *
kernel_context(struct drm_i915_private * i915)103 kernel_context(struct drm_i915_private *i915)
104 {
105 	struct i915_gem_context *ctx;
106 
107 	ctx = i915_gem_create_context(i915, 0);
108 	if (IS_ERR(ctx))
109 		return ctx;
110 
111 	i915_gem_context_clear_bannable(ctx);
112 	i915_gem_context_set_persistence(ctx);
113 
114 	return ctx;
115 }
116 
kernel_context_close(struct i915_gem_context * ctx)117 void kernel_context_close(struct i915_gem_context *ctx)
118 {
119 	context_close(ctx);
120 }
121