drm/i915: Re-enable GTT following a device reset
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 6 Sep 2017 11:14:05 +0000 (12:14 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 6 Sep 2017 13:17:32 +0000 (14:17 +0100)
Ville Syrjälä spotted that PGETBL_CTL was losing its enable bit upon a
reset. That was causing the display to show garbage on his 945gm. On my
i915gm the effect was far more severe; re-enabling the display following
the reset without PGETBL_CTL being enabled lead to an immediate hard
hang.

We do have a routine to re-enable PGETBL_CTL which is applicable to
gen2-4, although on gen4 it is documented that a graphics reset doesn't
alter the register (no such wording is given for gen3) and should be safe
to call to punch back in the enable bit. However, that leaves the question
of whether we need to completely re-initialise the register and the
rest of the GSM. For g33/pnv/gen4+, where we do have a configurable
page table, its contents do seem to be kept, and so we should be able to
recover without having to reinitialise the GTT from scratch (as prior to
g33, that register is configured by the BIOS and we leave alone except
for the enable bit).

This appears to have been broken by commit 5fbd0418eef2 ("drm/i915:
Re-enable GGTT earlier during resume on pre-gen6 platforms"), which
moved the intel_enable_gtt() from i915_gem_init_hw() (also used by
reset) to add it earlier during hw init and resume, missing the reset
path.

v2: Find the culprit, rearrange ggtt_enable to be before gem_init_hw to
match init/resume

Reported-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Fixes: 5fbd0418eef2 ("drm/i915: Re-enable GGTT earlier during resume on pre-gen6 platforms")
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101852
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Reviewed-by: Daniel Vetter <daniel@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20170906111405.27110-1-chris@chris-wilson.co.uk
Tested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
drivers/gpu/drm/i915/i915_drv.c

index f10a078e3a55a337e1030b825896c79e1c4d5c69..ff70fc45ba7c57b30f0a4141a12168e124e164bd 100644 (file)
@@ -1892,9 +1892,15 @@ void i915_reset(struct drm_i915_private *i915, unsigned int flags)
 
        /*
         * Everything depends on having the GTT running, so we need to start
-        * there.  Fortunately we don't need to do this unless we reset the
-        * chip at a PCI level.
-        *
+        * there.
+        */
+       ret = i915_ggtt_enable_hw(i915);
+       if (ret) {
+               DRM_ERROR("Failed to re-enable GGTT following reset %d\n", ret);
+               goto error;
+       }
+
+       /*
         * Next we need to restore the context, but we don't use those
         * yet either...
         *