Commit 978f1e09 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Move the magical deferred context allocation into the request

We can hide more details of execlists from higher level code by removing
the explicit call to create an execlist context from execbuffer and
into its first use by execlists.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1461833819-3991-20-git-send-email-chris@chris-wilson.co.uk
parent 24f1d3cc
...@@ -1085,14 +1085,6 @@ i915_gem_validate_context(struct drm_device *dev, struct drm_file *file, ...@@ -1085,14 +1085,6 @@ i915_gem_validate_context(struct drm_device *dev, struct drm_file *file,
return ERR_PTR(-EIO); return ERR_PTR(-EIO);
} }
if (i915.enable_execlists && !ctx->engine[engine->id].state) {
int ret = intel_lr_context_deferred_alloc(ctx, engine);
if (ret) {
DRM_DEBUG("Could not create LRC %u: %d\n", ctx_id, ret);
return ERR_PTR(ret);
}
}
return ctx; return ctx;
} }
......
...@@ -228,6 +228,8 @@ enum { ...@@ -228,6 +228,8 @@ enum {
#define GEN8_CTX_RCS_INDIRECT_CTX_OFFSET_DEFAULT 0x17 #define GEN8_CTX_RCS_INDIRECT_CTX_OFFSET_DEFAULT 0x17
#define GEN9_CTX_RCS_INDIRECT_CTX_OFFSET_DEFAULT 0x26 #define GEN9_CTX_RCS_INDIRECT_CTX_OFFSET_DEFAULT 0x26
static int execlists_context_deferred_alloc(struct intel_context *ctx,
struct intel_engine_cs *engine);
static int intel_lr_context_pin(struct intel_context *ctx, static int intel_lr_context_pin(struct intel_context *ctx,
struct intel_engine_cs *engine); struct intel_engine_cs *engine);
...@@ -685,6 +687,12 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request ...@@ -685,6 +687,12 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request
*/ */
request->reserved_space += MIN_SPACE_FOR_ADD_REQUEST; request->reserved_space += MIN_SPACE_FOR_ADD_REQUEST;
if (request->ctx->engine[engine->id].state == NULL) {
ret = execlists_context_deferred_alloc(request->ctx, engine);
if (ret)
return ret;
}
request->ringbuf = request->ctx->engine[engine->id].ringbuf; request->ringbuf = request->ctx->engine[engine->id].ringbuf;
if (i915.enable_guc_submission) { if (i915.enable_guc_submission) {
...@@ -2008,7 +2016,7 @@ logical_ring_init(struct drm_device *dev, struct intel_engine_cs *engine) ...@@ -2008,7 +2016,7 @@ logical_ring_init(struct drm_device *dev, struct intel_engine_cs *engine)
if (ret) if (ret)
goto error; goto error;
ret = intel_lr_context_deferred_alloc(dctx, engine); ret = execlists_context_deferred_alloc(dctx, engine);
if (ret) if (ret)
goto error; goto error;
...@@ -2482,9 +2490,9 @@ uint32_t intel_lr_context_size(struct intel_engine_cs *engine) ...@@ -2482,9 +2490,9 @@ uint32_t intel_lr_context_size(struct intel_engine_cs *engine)
} }
/** /**
* intel_lr_context_deferred_alloc() - create the LRC specific bits of a context * execlists_context_deferred_alloc() - create the LRC specific bits of a context
* @ctx: LR context to create. * @ctx: LR context to create.
* @ring: engine to be used with the context. * @engine: engine to be used with the context.
* *
* This function can be called more than once, with different engines, if we plan * This function can be called more than once, with different engines, if we plan
* to use the context with them. The context backing objects and the ringbuffers * to use the context with them. The context backing objects and the ringbuffers
...@@ -2494,8 +2502,7 @@ uint32_t intel_lr_context_size(struct intel_engine_cs *engine) ...@@ -2494,8 +2502,7 @@ uint32_t intel_lr_context_size(struct intel_engine_cs *engine)
* *
* Return: non-zero on error. * Return: non-zero on error.
*/ */
static int execlists_context_deferred_alloc(struct intel_context *ctx,
int intel_lr_context_deferred_alloc(struct intel_context *ctx,
struct intel_engine_cs *engine) struct intel_engine_cs *engine)
{ {
struct drm_device *dev = engine->dev; struct drm_device *dev = engine->dev;
......
...@@ -101,8 +101,6 @@ static inline void intel_logical_ring_emit_reg(struct intel_ringbuffer *ringbuf, ...@@ -101,8 +101,6 @@ static inline void intel_logical_ring_emit_reg(struct intel_ringbuffer *ringbuf,
void intel_lr_context_free(struct intel_context *ctx); void intel_lr_context_free(struct intel_context *ctx);
uint32_t intel_lr_context_size(struct intel_engine_cs *engine); uint32_t intel_lr_context_size(struct intel_engine_cs *engine);
int intel_lr_context_deferred_alloc(struct intel_context *ctx,
struct intel_engine_cs *engine);
void intel_lr_context_unpin(struct intel_context *ctx, void intel_lr_context_unpin(struct intel_context *ctx,
struct intel_engine_cs *engine); struct intel_engine_cs *engine);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment