If fence register save/restore really is the issue, this patch should help.
Current code saves the fence registers before rendering has completed, which can affect fence register allocation. If we save before rendering completes, and restore again at resume time, we may end up causing trouble with whatever objects land in the fenced space after resume.
Saving register state (including fences) *after* we've idled the memory manager should help with that.
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 98560e1..e3cb402 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -67,8 +67,6 @@ static int i915_suspend(struct drm_device *dev, pm_message_t s
pci_save_state(dev->pdev);
- i915_save_state(dev);
-
/* If KMS is active, we do the leavevt stuff here */
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
if (i915_gem_idle(dev))
@@ -77,6 +75,8 @@ static int i915_suspend(struct drm_device *dev, pm_message_t s drm_irq_uninstall(dev);
}
If fence register save/restore really is the issue, this patch should help.
Current code saves the fence registers before rendering has completed, which can affect fence register allocation. If we save before rendering completes, and restore again at resume time, we may end up causing trouble with whatever objects land in the fenced space after resume.
Saving register state (including fences) *after* we've idled the memory manager should help with that.
diff --git a/drivers/ gpu/drm/ i915/i915_ drv.c b/drivers/ gpu/drm/ i915/i915_ drv.c gpu/drm/ i915/i915_ drv.c gpu/drm/ i915/i915_ drv.c
index 98560e1..e3cb402 100644
--- a/drivers/
+++ b/drivers/
@@ -67,8 +67,6 @@ static int i915_suspend(struct drm_device *dev, pm_message_t s
- i915_save_ state(dev) ; check_feature( dev, DRIVER_MODESET)) { idle(dev) )
drm_irq_ uninstall( dev);
-
/* If KMS is active, we do the leavevt stuff here */
if (drm_core_
if (i915_gem_
@@ -77,6 +75,8 @@ static int i915_suspend(struct drm_device *dev, pm_message_t s
}
+ i915_save_ state(dev) ;
intel_ opregion_ free(dev, 1);
+
if (state.event == PM_EVENT_SUSPEND) {