drm/i915: Restore sane defaults for KMS on GEM error load
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 26 Jul 2018 08:50:32 +0000 (09:50 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 26 Jul 2018 11:53:28 +0000 (12:53 +0100)
If we fail during GEM initialisation, we scrub the HW state by
performing a device level GPU resuet. However, we want to leave the
system in a usable state (with functioning KMS but no GEM) so after
scrubbing the HW state, we need to restore some sane defaults and
re-enable the low-level common parts of the GPU (such as the GMCH).

v2: Restore GTT entries.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20180726085033.4044-2-chris@chris-wilson.co.uk
Reviewed-by: MichaƂ Winiarski <michal.winiarski@intel.com>
drivers/gpu/drm/i915/i915_gem.c

index 0946e1932907679b716100446623b8b75de06066..3ca6a336408522db0de7a4638698ccd98a2daa90 100644 (file)
@@ -5598,6 +5598,8 @@ err_uc_misc:
                i915_gem_cleanup_userptr(dev_priv);
 
        if (ret == -EIO) {
+               mutex_lock(&dev_priv->drm.struct_mutex);
+
                /*
                 * Allow engine initialisation to fail by marking the GPU as
                 * wedged. But we only want to do this where the GPU is angry,
@@ -5608,7 +5610,14 @@ err_uc_misc:
                                        "Failed to initialize GPU, declaring it wedged!\n");
                        i915_gem_set_wedged(dev_priv);
                }
-               ret = 0;
+
+               /* Minimal basic recovery for KMS */
+               ret = i915_ggtt_enable_hw(dev_priv);
+               i915_gem_restore_gtt_mappings(dev_priv);
+               i915_gem_restore_fences(dev_priv);
+               intel_init_clock_gating(dev_priv);
+
+               mutex_unlock(&dev_priv->drm.struct_mutex);
        }
 
        i915_gem_drain_freed_objects(dev_priv);