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 * 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 70 void mock_context_close(struct i915_gem_context *ctx) 71 { 72 context_close(ctx); 73 } 74 75 void mock_init_contexts(struct drm_i915_private *i915) 76 { 77 init_contexts(&i915->gem.contexts); 78 } 79 80 struct i915_gem_context * 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 * 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 117 void kernel_context_close(struct i915_gem_context *ctx) 118 { 119 context_close(ctx); 120 } 121