mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Allocate only an internal intel_context for the kernel_context, forgoing a global GEM context for internal use as we only require a separate address space (for our own protection). Now having weaned GT from requiring ce->gem_context, we can stop referencing it entirely. This also means we no longer have to create random and unnecessary GEM contexts for internal use. GEM contexts are now entirely for tracking GEM clients, and intel_context the execution environment on the GPU. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Andi Shyti <andi.shyti@intel.com> Acked-by: Andi Shyti <andi.shyti@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20191221160324.1073045-1-chris@chris-wilson.co.uk
114 lines
2 KiB
C
114 lines
2 KiB
C
/*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
* Copyright © 2016 Intel Corporation
|
|
*/
|
|
|
|
#include "mock_context.h"
|
|
#include "selftests/mock_drm.h"
|
|
#include "selftests/mock_gtt.h"
|
|
|
|
struct i915_gem_context *
|
|
mock_context(struct drm_i915_private *i915,
|
|
const char *name)
|
|
{
|
|
struct i915_gem_context *ctx;
|
|
struct i915_gem_engines *e;
|
|
|
|
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
|
|
if (!ctx)
|
|
return NULL;
|
|
|
|
kref_init(&ctx->ref);
|
|
INIT_LIST_HEAD(&ctx->link);
|
|
ctx->i915 = i915;
|
|
|
|
i915_gem_context_set_persistence(ctx);
|
|
|
|
mutex_init(&ctx->engines_mutex);
|
|
e = default_engines(ctx);
|
|
if (IS_ERR(e))
|
|
goto err_free;
|
|
RCU_INIT_POINTER(ctx->engines, e);
|
|
|
|
INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL);
|
|
mutex_init(&ctx->mutex);
|
|
|
|
if (name) {
|
|
struct i915_ppgtt *ppgtt;
|
|
|
|
strncpy(ctx->name, name, sizeof(ctx->name));
|
|
|
|
ppgtt = mock_ppgtt(i915, name);
|
|
if (!ppgtt)
|
|
goto err_put;
|
|
|
|
mutex_lock(&ctx->mutex);
|
|
__set_ppgtt(ctx, &ppgtt->vm);
|
|
mutex_unlock(&ctx->mutex);
|
|
|
|
i915_vm_put(&ppgtt->vm);
|
|
}
|
|
|
|
return ctx;
|
|
|
|
err_free:
|
|
kfree(ctx);
|
|
return NULL;
|
|
|
|
err_put:
|
|
i915_gem_context_set_closed(ctx);
|
|
i915_gem_context_put(ctx);
|
|
return NULL;
|
|
}
|
|
|
|
void mock_context_close(struct i915_gem_context *ctx)
|
|
{
|
|
context_close(ctx);
|
|
}
|
|
|
|
void mock_init_contexts(struct drm_i915_private *i915)
|
|
{
|
|
init_contexts(&i915->gem.contexts);
|
|
}
|
|
|
|
struct i915_gem_context *
|
|
live_context(struct drm_i915_private *i915, struct file *file)
|
|
{
|
|
struct i915_gem_context *ctx;
|
|
int err;
|
|
|
|
ctx = i915_gem_create_context(i915, 0);
|
|
if (IS_ERR(ctx))
|
|
return ctx;
|
|
|
|
err = gem_context_register(ctx, to_drm_file(file)->driver_priv);
|
|
if (err < 0)
|
|
goto err_ctx;
|
|
|
|
return ctx;
|
|
|
|
err_ctx:
|
|
context_close(ctx);
|
|
return ERR_PTR(err);
|
|
}
|
|
|
|
struct i915_gem_context *
|
|
kernel_context(struct drm_i915_private *i915)
|
|
{
|
|
struct i915_gem_context *ctx;
|
|
|
|
ctx = i915_gem_create_context(i915, 0);
|
|
if (IS_ERR(ctx))
|
|
return ctx;
|
|
|
|
i915_gem_context_clear_bannable(ctx);
|
|
i915_gem_context_set_persistence(ctx);
|
|
|
|
return ctx;
|
|
}
|
|
|
|
void kernel_context_close(struct i915_gem_context *ctx)
|
|
{
|
|
context_close(ctx);
|
|
}
|