drm/i915/guc: Initialize GuC before restarting engines
authorMichał Winiarski <michal.winiarski@intel.com>
Wed, 25 Oct 2017 17:25:19 +0000 (18:25 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 25 Oct 2017 18:41:04 +0000 (19:41 +0100)
Now that we're handling request resubmission the same way as regular
submission (from the tasklet), we can move GuC initialization earlier,
before restarting the engines. This way, we're no longer being in the
state of flux during engine restart - we're already in user requested
submission mode.

Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Michel Thierry <michel.thierry@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Cc: Oscar Mateo <oscar.mateo@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20171025172519.10670-5-chris@chris-wilson.co.uk
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_guc_submission.c
drivers/gpu/drm/i915/intel_lrc.c

index 8364304e9d2b23924d509aa15a67c278aaca7880..d803ef5f4a7f26a5942fb05a393f392ca4f1439f 100644 (file)
@@ -4926,6 +4926,11 @@ int i915_gem_init_hw(struct drm_i915_private *dev_priv)
                goto out;
        }
 
+       /* We can't enable contexts until all firmware is loaded */
+       ret = intel_uc_init_hw(dev_priv);
+       if (ret)
+               goto out;
+
        /* Need to do basic initialisation of all rings first: */
        ret = __i915_gem_restart_engines(dev_priv);
        if (ret)
@@ -4933,11 +4938,6 @@ int i915_gem_init_hw(struct drm_i915_private *dev_priv)
 
        intel_mocs_init_l3cc_table(dev_priv);
 
-       /* We can't enable contexts until all firmware is loaded */
-       ret = intel_uc_init_hw(dev_priv);
-       if (ret)
-               goto out;
-
 out:
        intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
        return ret;
index 141ed9df3d5ca83648053b76de187ac9ebe980f6..07289a4b5bfa5fe74edd9dc6bca8893ee53b55ce 100644 (file)
@@ -1132,15 +1132,7 @@ int i915_guc_submission_enable(struct drm_i915_private *dev_priv)
 
        for_each_engine(engine, dev_priv, id) {
                struct intel_engine_execlists * const execlists = &engine->execlists;
-               /* The tasklet was initialised by execlists, and may be in
-                * a state of flux (across a reset) and so we just want to
-                * take over the callback without changing any other state
-                * in the tasklet.
-                */
                execlists->irq_tasklet.func = i915_guc_irq_handler;
-               clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted);
-               tasklet_schedule(&execlists->irq_tasklet);
-
                engine->park = i915_guc_submission_park;
                engine->unpark = i915_guc_submission_unpark;
        }
index eeb3622803a8f73f40d7c197ab56822efc55afc8..e821c1eba7a44512b5cd9ea03e343aca46d0d1dd 100644 (file)
@@ -1474,7 +1474,7 @@ static int gen8_init_common_ring(struct intel_engine_cs *engine)
        execlists->active = 0;
 
        /* After a GPU reset, we may have requests to replay */
-       if (!i915_modparams.enable_guc_submission && execlists->first)
+       if (execlists->first)
                tasklet_schedule(&execlists->irq_tasklet);
 
        return 0;