drm/i915: Re-enable GGTT earlier during resume on pre-gen6 platforms
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 6 May 2016 18:35:55 +0000 (21:35 +0300)
committerJani Nikula <jani.nikula@intel.com>
Mon, 23 May 2016 08:10:48 +0000 (11:10 +0300)
Move the intel_enable_gtt() call to happen before we touch the GTT
during resume. Right now it's done way too late. Before
commit ebb7c78d358b ("agp/intel-gtt: Only register fake agp driver for gen1")
it was actually done earlier on account of also getting called from
the resume hook of the fake agp driver. With the fake agp driver
no longer getting registered we must move the call up.

The symptoms I've seen on my 830 machine include lowmem corruption,
other kinds of memory corruption, and straight up hung machine during
or just after resume. Not really sure what causes the memory corruption,
but so far I've not seen any with this fix.

I think we shouldn't really need to call this during init, but we have
been doing that so I've decided to keep the call. However moving that
call earlier could be prudent as well. Doing it right after the
intel-gtt probe seems appropriate.

Also tested this on 946gz,elk,ilk and all seemed quite happy with
this change.

v2: Reorder init_hw vs. enable_hw functions (Chris)

Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: drm-intel-fixes@lists.freedesktop.org
Fixes: ebb7c78d358b ("agp/intel-gtt: Only register fake agp driver for gen1")
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1462559755-353-1-git-send-email-ville.syrjala@linux.intel.com
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
(cherry picked from commit ac840ae53573d9f435c88c131f6707a79aecb466)
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_gem_gtt.h

index 5c7615041b31b9e60c72549f3dda994a0f6474d4..157af1433889c24a6bcab59143f4a090815fd73f 100644 (file)
@@ -1186,6 +1186,12 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
        if (ret)
                return ret;
 
+       ret = i915_ggtt_enable_hw(dev);
+       if (ret) {
+               DRM_ERROR("failed to enable GGTT\n");
+               goto out_ggtt;
+       }
+
        /* WARNING: Apparently we must kick fbdev drivers before vgacon,
         * otherwise the vga fbdev driver falls over. */
        ret = i915_kick_out_firmware_fb(dev_priv);
index 7a0e4d6c71e2302e0b50ad88a805cda6d549259d..dd36760f7da6c093491fcf67d4450c2028bbf314 100644 (file)
@@ -734,9 +734,14 @@ int i915_suspend_switcheroo(struct drm_device *dev, pm_message_t state)
 static int i915_drm_resume(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
+       int ret;
 
        disable_rpm_wakeref_asserts(dev_priv);
 
+       ret = i915_ggtt_enable_hw(dev);
+       if (ret)
+               DRM_ERROR("failed to re-enable GGTT\n");
+
        intel_csr_ucode_resume(dev_priv);
 
        mutex_lock(&dev->struct_mutex);
index a14a98341a4b46108a6935b98032120e6689e273..640c6c1ee72e4a74d98a4d9c7657ff33bd1e9289 100644 (file)
@@ -4860,9 +4860,6 @@ i915_gem_init_hw(struct drm_device *dev)
        struct intel_engine_cs *engine;
        int ret, j;
 
-       if (INTEL_INFO(dev)->gen < 6 && !intel_enable_gtt())
-               return -EIO;
-
        /* Double layer security blanket, see i915_gem_init() */
        intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
 
index 0d666b3f7e9bad0668a5b0d9b6d461ed462a84a0..92acdff9dad31817960d83f9c02e2506f79509a2 100644 (file)
@@ -3236,6 +3236,14 @@ out_gtt_cleanup:
        return ret;
 }
 
+int i915_ggtt_enable_hw(struct drm_device *dev)
+{
+       if (INTEL_INFO(dev)->gen < 6 && !intel_enable_gtt())
+               return -EIO;
+
+       return 0;
+}
+
 void i915_gem_restore_gtt_mappings(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
index d7dd3d8a87582c31f2dd95f7abf6852ae76e8369..0008543d55f616f1ddf3e0be66c5e9265dc0c98f 100644 (file)
@@ -514,6 +514,7 @@ i915_page_dir_dma_addr(const struct i915_hw_ppgtt *ppgtt, const unsigned n)
 }
 
 int i915_ggtt_init_hw(struct drm_device *dev);
+int i915_ggtt_enable_hw(struct drm_device *dev);
 void i915_gem_init_ggtt(struct drm_device *dev);
 void i915_ggtt_cleanup_hw(struct drm_device *dev);