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