drm/i915/gt: Avoid using the GPU before initialisation
authorChris Wilson <chris@chris-wilson.co.uk>
Sun, 29 Dec 2019 18:31:49 +0000 (18:31 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 30 Dec 2019 14:04:57 +0000 (14:04 +0000)
Mark the GT as wedged so that we are not tempted to use it prior to
initialisation.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Andi Shyti <andi.shyti@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191229183153.3719869-3-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_engine_pm.c
drivers/gpu/drm/i915/gt/intel_gt_pm.c
drivers/gpu/drm/i915/gt/intel_reset.c
drivers/gpu/drm/i915/selftests/mock_gem_device.c

index 010620b..cd82f0b 100644 (file)
@@ -123,16 +123,16 @@ static bool switch_to_kernel_context(struct intel_engine_cs *engine)
        unsigned long flags;
        bool result = true;
 
+       /* GPU is pointing to the void, as good as in the kernel context. */
+       if (intel_gt_is_wedged(engine->gt))
+               return true;
+
        GEM_BUG_ON(!intel_context_is_barrier(ce));
 
        /* Already inside the kernel context, safe to power down. */
        if (engine->wakeref_serial == engine->serial)
                return true;
 
-       /* GPU is pointing to the void, as good as in the kernel context. */
-       if (intel_gt_is_wedged(engine->gt))
-               return true;
-
        /*
         * Note, we do this without taking the timeline->mutex. We cannot
         * as we may be called while retiring the kernel context and so
index 3cda837..9b220c9 100644 (file)
@@ -179,7 +179,7 @@ int intel_gt_resume(struct intel_gt *gt)
        enum intel_engine_id id;
        int err;
 
-       err = intel_gt_terminally_wedged(gt);
+       err = intel_gt_has_init_error(gt);
        if (err)
                return err;
 
@@ -196,6 +196,10 @@ int intel_gt_resume(struct intel_gt *gt)
        intel_uncore_forcewake_get(gt->uncore, FORCEWAKE_ALL);
        intel_rc6_sanitize(&gt->rc6);
        gt_sanitize(gt, true);
+       if (intel_gt_is_wedged(gt)) {
+               err = -EIO;
+               goto out_fw;
+       }
 
        /* Only when the HW is re-initialised, can we replay the requests */
        err = intel_gt_init_hw(gt);
index 8af2533..fe919a1 100644 (file)
@@ -1353,6 +1353,9 @@ void intel_gt_init_reset(struct intel_gt *gt)
        init_waitqueue_head(&gt->reset.queue);
        mutex_init(&gt->reset.mutex);
        init_srcu_struct(&gt->reset.backoff_srcu);
+
+       /* no GPU until we are ready! */
+       __set_bit(I915_WEDGED, &gt->reset.flags);
 }
 
 void intel_gt_fini_reset(struct intel_gt *gt)
index ac641f5..2b01094 100644 (file)
@@ -184,6 +184,7 @@ struct drm_i915_private *mock_gem_device(void)
        if (mock_engine_init(i915->engine[RCS0]))
                goto err_context;
 
+       __clear_bit(I915_WEDGED, &i915->gt.reset.flags);
        intel_engines_driver_register(i915);
 
        return i915;