Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 20a8a74a authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Move calling engine->init_hw() to its own function



Just a simple refactor to move a loop and some support code out of
i915_gem_init_hw(). This is in preparation for avoiding a race between
the tasklet writing to ELSP whilst simultaneously being written by
engine->init_hw() following a GPU reset.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170208143033.11651-1-chris@chris-wilson.co.uk
parent 519d5249
Loading
Loading
Loading
Loading
+18 −7
Original line number Diff line number Diff line
@@ -4367,11 +4367,24 @@ static void init_unused_rings(struct drm_i915_private *dev_priv)
	}
}

int
i915_gem_init_hw(struct drm_i915_private *dev_priv)
static int __i915_gem_restart_engines(void *data)
{
	struct drm_i915_private *i915 = data;
	struct intel_engine_cs *engine;
	enum intel_engine_id id;
	int err;

	for_each_engine(engine, i915, id) {
		err = engine->init_hw(engine);
		if (err)
			return err;
	}

	return 0;
}

int i915_gem_init_hw(struct drm_i915_private *dev_priv)
{
	int ret;

	dev_priv->gt.last_init_time = ktime_get();
@@ -4417,11 +4430,9 @@ i915_gem_init_hw(struct drm_i915_private *dev_priv)
	}

	/* Need to do basic initialisation of all rings first: */
	for_each_engine(engine, dev_priv, id) {
		ret = engine->init_hw(engine);
	ret = __i915_gem_restart_engines(dev_priv);
	if (ret)
		goto out;
	}

	intel_mocs_init_l3cc_table(dev_priv);