summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/i915/intel_context.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2019-03-08 16:25:20 +0300
committerChris Wilson <chris@chris-wilson.co.uk>2019-03-08 16:59:59 +0300
commit95f697eb024d7def7f9050cd5eba9502034dd94d (patch)
tree24577c5516ef1f53609e9fe99585c7eae87c1b50 /drivers/gpu/drm/i915/intel_context.c
parentc4d52feb2c46ddcdde4058cf03f8b9eb996bb09b (diff)
downloadlinux-95f697eb024d7def7f9050cd5eba9502034dd94d.tar.xz
drm/i915: Make context pinning part of intel_context_ops
Push the intel_context pin callback down from intel_engine_cs onto the context itself by virtue of having a central caller for intel_context_pin() being able to lookup the intel_context itself. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190308132522.21573-5-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm/i915/intel_context.c')
-rw-r--r--drivers/gpu/drm/i915/intel_context.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_context.c b/drivers/gpu/drm/i915/intel_context.c
index d04a1f51a90c..4c1dacb69f51 100644
--- a/drivers/gpu/drm/i915/intel_context.c
+++ b/drivers/gpu/drm/i915/intel_context.c
@@ -126,6 +126,40 @@ intel_context_instance(struct i915_gem_context *ctx,
return pos;
}
+struct intel_context *
+intel_context_pin(struct i915_gem_context *ctx,
+ struct intel_engine_cs *engine)
+{
+ struct intel_context *ce;
+ int err;
+
+ lockdep_assert_held(&ctx->i915->drm.struct_mutex);
+
+ ce = intel_context_instance(ctx, engine);
+ if (IS_ERR(ce))
+ return ce;
+
+ if (unlikely(!ce->pin_count++)) {
+ err = ce->ops->pin(ce);
+ if (err)
+ goto err_unpin;
+
+ mutex_lock(&ctx->mutex);
+ list_add(&ce->active_link, &ctx->active_engines);
+ mutex_unlock(&ctx->mutex);
+
+ i915_gem_context_get(ctx);
+ GEM_BUG_ON(ce->gem_context != ctx);
+ }
+ GEM_BUG_ON(!ce->pin_count); /* no overflow! */
+
+ return ce;
+
+err_unpin:
+ ce->pin_count = 0;
+ return ERR_PTR(err);
+}
+
static void intel_context_retire(struct i915_active_request *active,
struct i915_request *rq)
{