Home | History | Annotate | Line # | Download | only in selftests
      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