We may be without a context to perform various internal blitter operations, for example when performing object migration. Piggybacking off the kernel_context is probably a bad idea, since it has other uses. Signed-off-by: Matthew Auld <matthew.auld@xxxxxxxxx> Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> Cc: Abdiel Janulgue <abdiel.janulgue@xxxxxxxxxxxxxxx> --- drivers/gpu/drm/i915/i915_drv.h | 2 ++ drivers/gpu/drm/i915/i915_gem_context.c | 13 +++++++++++++ drivers/gpu/drm/i915/selftests/mock_gem_device.c | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index feec3bab0f5f..5b39af57c36c 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1544,6 +1544,8 @@ struct drm_i915_private { struct intel_engine_cs *engine[I915_NUM_ENGINES]; /* Context used internally to idle the GPU and setup initial state */ struct i915_gem_context *kernel_context; + /* Context used internally for various blitting operations */ + struct i915_gem_context *blitter_context; /* Context only to be used for injecting preemption commands */ struct i915_gem_context *preempt_context; struct intel_engine_cs *engine_class[MAX_ENGINE_CLASS + 1] diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 280813a4bf82..e814030dd89a 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c @@ -583,6 +583,18 @@ int i915_gem_contexts_init(struct drm_i915_private *dev_priv) GEM_BUG_ON(!atomic_read(&ctx->hw_id_pin_count)); dev_priv->kernel_context = ctx; + ctx = i915_gem_context_create_kernel(dev_priv, I915_PRIORITY_NORMAL); + if (IS_ERR(ctx)) { + DRM_ERROR("Failed to create blitter global context\n"); + return PTR_ERR(ctx); + } + + /* + * XXX: one idea here is do s/kernel_context/idle_context/, then use the + * kernel_context for doing things like blitting... + */ + dev_priv->blitter_context = ctx; + /* highest priority; preempting task */ if (needs_preempt_context(dev_priv)) { ctx = i915_gem_context_create_kernel(dev_priv, INT_MAX); @@ -615,6 +627,7 @@ void i915_gem_contexts_fini(struct drm_i915_private *i915) if (i915->preempt_context) destroy_kernel_context(&i915->preempt_context); + destroy_kernel_context(&i915->blitter_context); destroy_kernel_context(&i915->kernel_context); /* Must free all deferred contexts (via flush_workqueue) first */ diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c b/drivers/gpu/drm/i915/selftests/mock_gem_device.c index f8901cd12180..0b59246c99c8 100644 --- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c +++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c @@ -248,6 +248,10 @@ struct drm_i915_private *mock_gem_device(void) if (!i915->engine[RCS]) goto err_context; + i915->blitter_context = mock_context(i915, NULL); + if (!i915->blitter_context) + goto err_context; + mutex_unlock(&i915->drm.struct_mutex); WARN_ON(i915_gemfs_init(i915)); -- 2.20.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx