Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull the intel i915 hibernation memory corruption fix from Dave Airlie: "I tracked down the misc memory corruption after i915 hibernate to the blinking fbcon cursor, and realised the i915 driver wasn't doing the fbdev suspend/resume calls at all. nouveau and radeon have done these calls for a long time. This has been fairly well tested and is definitely the main culprit in hibernate not working." Yay. * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: drm/i915: suspend fbdev device around suspend/hibernate
This commit is contained in:
commit
0a03726ca9
|
@ -467,6 +467,10 @@ static int i915_drm_freeze(struct drm_device *dev)
|
||||||
/* Modeset on resume, not lid events */
|
/* Modeset on resume, not lid events */
|
||||||
dev_priv->modeset_on_lid = 0;
|
dev_priv->modeset_on_lid = 0;
|
||||||
|
|
||||||
|
console_lock();
|
||||||
|
intel_fbdev_set_suspend(dev, 1);
|
||||||
|
console_unlock();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -539,6 +543,9 @@ static int i915_drm_thaw(struct drm_device *dev)
|
||||||
|
|
||||||
dev_priv->modeset_on_lid = 0;
|
dev_priv->modeset_on_lid = 0;
|
||||||
|
|
||||||
|
console_lock();
|
||||||
|
intel_fbdev_set_suspend(dev, 0);
|
||||||
|
console_unlock();
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -382,7 +382,7 @@ extern int intel_framebuffer_init(struct drm_device *dev,
|
||||||
struct drm_i915_gem_object *obj);
|
struct drm_i915_gem_object *obj);
|
||||||
extern int intel_fbdev_init(struct drm_device *dev);
|
extern int intel_fbdev_init(struct drm_device *dev);
|
||||||
extern void intel_fbdev_fini(struct drm_device *dev);
|
extern void intel_fbdev_fini(struct drm_device *dev);
|
||||||
|
extern void intel_fbdev_set_suspend(struct drm_device *dev, int state);
|
||||||
extern void intel_prepare_page_flip(struct drm_device *dev, int plane);
|
extern void intel_prepare_page_flip(struct drm_device *dev, int plane);
|
||||||
extern void intel_finish_page_flip(struct drm_device *dev, int pipe);
|
extern void intel_finish_page_flip(struct drm_device *dev, int pipe);
|
||||||
extern void intel_finish_page_flip_plane(struct drm_device *dev, int plane);
|
extern void intel_finish_page_flip_plane(struct drm_device *dev, int plane);
|
||||||
|
|
|
@ -254,6 +254,16 @@ void intel_fbdev_fini(struct drm_device *dev)
|
||||||
kfree(dev_priv->fbdev);
|
kfree(dev_priv->fbdev);
|
||||||
dev_priv->fbdev = NULL;
|
dev_priv->fbdev = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void intel_fbdev_set_suspend(struct drm_device *dev, int state)
|
||||||
|
{
|
||||||
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
|
if (!dev_priv->fbdev)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fb_set_suspend(dev_priv->fbdev->helper.fbdev, state);
|
||||||
|
}
|
||||||
|
|
||||||
MODULE_LICENSE("GPL and additional rights");
|
MODULE_LICENSE("GPL and additional rights");
|
||||||
|
|
||||||
void intel_fb_output_poll_changed(struct drm_device *dev)
|
void intel_fb_output_poll_changed(struct drm_device *dev)
|
||||||
|
|
Loading…
Reference in New Issue