|
@@ -458,6 +458,7 @@ bool i915_semaphore_is_enabled(struct drm_device *dev)
|
|
|
static int i915_drm_freeze(struct drm_device *dev)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ struct drm_crtc *crtc;
|
|
|
|
|
|
/* ignore lid events during suspend */
|
|
|
mutex_lock(&dev_priv->modeset_restore_lock);
|
|
@@ -481,10 +482,14 @@ static int i915_drm_freeze(struct drm_device *dev)
|
|
|
|
|
|
cancel_delayed_work_sync(&dev_priv->rps.delayed_resume_work);
|
|
|
|
|
|
- intel_modeset_disable(dev);
|
|
|
-
|
|
|
drm_irq_uninstall(dev);
|
|
|
dev_priv->enable_hotplug_processing = false;
|
|
|
+ /*
|
|
|
+ * Disable CRTCs directly since we want to preserve sw state
|
|
|
+ * for _thaw.
|
|
|
+ */
|
|
|
+ list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
|
|
|
+ dev_priv->display.crtc_disable(crtc);
|
|
|
}
|
|
|
|
|
|
i915_save_state(dev);
|
|
@@ -562,7 +567,10 @@ static int __i915_drm_thaw(struct drm_device *dev)
|
|
|
drm_irq_install(dev);
|
|
|
|
|
|
intel_modeset_init_hw(dev);
|
|
|
- intel_modeset_setup_hw_state(dev, false);
|
|
|
+
|
|
|
+ drm_modeset_lock_all(dev);
|
|
|
+ intel_modeset_setup_hw_state(dev, true);
|
|
|
+ drm_modeset_unlock_all(dev);
|
|
|
|
|
|
/*
|
|
|
* ... but also need to make sure that hotplug processing
|