mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-18 06:33:43 -04:00
drm/i915: Split engine setup/init into two phases
In the next patch, we require the engine vfuncs setup prior to initialising the pinned kernel contexts, so split the vfunc setup from the engine initialisation and call it earlier. v2: s/setup_xcs/setup_common/ for intel_ring_submission_setup() 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/20190426163336.15906-6-chris@chris-wilson.co.uk
This commit is contained in:
@@ -239,7 +239,6 @@ struct intel_engine_cs *mock_engine(struct drm_i915_private *i915,
|
||||
int id)
|
||||
{
|
||||
struct mock_engine *engine;
|
||||
int err;
|
||||
|
||||
GEM_BUG_ON(id >= I915_NUM_ENGINES);
|
||||
|
||||
@@ -265,37 +264,44 @@ struct intel_engine_cs *mock_engine(struct drm_i915_private *i915,
|
||||
engine->base.reset.finish = mock_reset_finish;
|
||||
engine->base.cancel_requests = mock_cancel_requests;
|
||||
|
||||
if (i915_timeline_init(i915, &engine->base.timeline, NULL))
|
||||
goto err_free;
|
||||
i915_timeline_set_subclass(&engine->base.timeline, TIMELINE_ENGINE);
|
||||
|
||||
intel_engine_init_breadcrumbs(&engine->base);
|
||||
intel_engine_init_execlists(&engine->base);
|
||||
intel_engine_init__pm(&engine->base);
|
||||
|
||||
/* fake hw queue */
|
||||
spin_lock_init(&engine->hw_lock);
|
||||
timer_setup(&engine->hw_delay, hw_delay_complete, 0);
|
||||
INIT_LIST_HEAD(&engine->hw_queue);
|
||||
|
||||
engine->base.kernel_context =
|
||||
intel_context_instance(i915->kernel_context, &engine->base);
|
||||
if (IS_ERR(engine->base.kernel_context))
|
||||
goto err_breadcrumbs;
|
||||
|
||||
err = intel_context_pin(engine->base.kernel_context);
|
||||
intel_context_put(engine->base.kernel_context);
|
||||
if (err)
|
||||
goto err_breadcrumbs;
|
||||
|
||||
return &engine->base;
|
||||
}
|
||||
|
||||
int mock_engine_init(struct intel_engine_cs *engine)
|
||||
{
|
||||
struct drm_i915_private *i915 = engine->i915;
|
||||
int err;
|
||||
|
||||
intel_engine_init_breadcrumbs(engine);
|
||||
intel_engine_init_execlists(engine);
|
||||
intel_engine_init__pm(engine);
|
||||
|
||||
if (i915_timeline_init(i915, &engine->timeline, NULL))
|
||||
goto err_breadcrumbs;
|
||||
i915_timeline_set_subclass(&engine->timeline, TIMELINE_ENGINE);
|
||||
|
||||
engine->kernel_context =
|
||||
intel_context_instance(i915->kernel_context, engine);
|
||||
if (IS_ERR(engine->kernel_context))
|
||||
goto err_timeline;
|
||||
|
||||
err = intel_context_pin(engine->kernel_context);
|
||||
intel_context_put(engine->kernel_context);
|
||||
if (err)
|
||||
goto err_timeline;
|
||||
|
||||
return 0;
|
||||
|
||||
err_timeline:
|
||||
i915_timeline_fini(&engine->timeline);
|
||||
err_breadcrumbs:
|
||||
intel_engine_fini_breadcrumbs(&engine->base);
|
||||
i915_timeline_fini(&engine->base.timeline);
|
||||
err_free:
|
||||
kfree(engine);
|
||||
return NULL;
|
||||
intel_engine_fini_breadcrumbs(engine);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
void mock_engine_flush(struct intel_engine_cs *engine)
|
||||
|
||||
Reference in New Issue
Block a user