diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_drv.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index f8b3df0926c..b293ef0bae7 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -27,6 +27,7 @@ | |||
27 | * | 27 | * |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include <linux/device.h> | ||
30 | #include "drmP.h" | 31 | #include "drmP.h" |
31 | #include "drm.h" | 32 | #include "drm.h" |
32 | #include "i915_drm.h" | 33 | #include "i915_drm.h" |
@@ -66,6 +67,14 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state) | |||
66 | 67 | ||
67 | i915_save_state(dev); | 68 | i915_save_state(dev); |
68 | 69 | ||
70 | /* If KMS is active, we do the leavevt stuff here */ | ||
71 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { | ||
72 | if (i915_gem_idle(dev)) | ||
73 | dev_err(&dev->pdev->dev, | ||
74 | "GEM idle failed, resume may fail\n"); | ||
75 | drm_irq_uninstall(dev); | ||
76 | } | ||
77 | |||
69 | intel_opregion_free(dev); | 78 | intel_opregion_free(dev); |
70 | 79 | ||
71 | if (state.event == PM_EVENT_SUSPEND) { | 80 | if (state.event == PM_EVENT_SUSPEND) { |
@@ -79,6 +88,9 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state) | |||
79 | 88 | ||
80 | static int i915_resume(struct drm_device *dev) | 89 | static int i915_resume(struct drm_device *dev) |
81 | { | 90 | { |
91 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
92 | int ret = 0; | ||
93 | |||
82 | pci_set_power_state(dev->pdev, PCI_D0); | 94 | pci_set_power_state(dev->pdev, PCI_D0); |
83 | pci_restore_state(dev->pdev); | 95 | pci_restore_state(dev->pdev); |
84 | if (pci_enable_device(dev->pdev)) | 96 | if (pci_enable_device(dev->pdev)) |
@@ -89,11 +101,26 @@ static int i915_resume(struct drm_device *dev) | |||
89 | 101 | ||
90 | intel_opregion_init(dev); | 102 | intel_opregion_init(dev); |
91 | 103 | ||
92 | return 0; | 104 | /* KMS EnterVT equivalent */ |
105 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { | ||
106 | mutex_lock(&dev->struct_mutex); | ||
107 | dev_priv->mm.suspended = 0; | ||
108 | |||
109 | ret = i915_gem_init_ringbuffer(dev); | ||
110 | if (ret != 0) | ||
111 | ret = -1; | ||
112 | mutex_unlock(&dev->struct_mutex); | ||
113 | |||
114 | drm_irq_install(dev); | ||
115 | } | ||
116 | |||
117 | return ret; | ||
93 | } | 118 | } |
94 | 119 | ||
95 | static struct vm_operations_struct i915_gem_vm_ops = { | 120 | static struct vm_operations_struct i915_gem_vm_ops = { |
96 | .fault = i915_gem_fault, | 121 | .fault = i915_gem_fault, |
122 | .open = drm_gem_vm_open, | ||
123 | .close = drm_gem_vm_close, | ||
97 | }; | 124 | }; |
98 | 125 | ||
99 | static struct drm_driver driver = { | 126 | static struct drm_driver driver = { |
@@ -112,7 +139,6 @@ static struct drm_driver driver = { | |||
112 | .suspend = i915_suspend, | 139 | .suspend = i915_suspend, |
113 | .resume = i915_resume, | 140 | .resume = i915_resume, |
114 | .device_is_agp = i915_driver_device_is_agp, | 141 | .device_is_agp = i915_driver_device_is_agp, |
115 | .get_vblank_counter = i915_get_vblank_counter, | ||
116 | .enable_vblank = i915_enable_vblank, | 142 | .enable_vblank = i915_enable_vblank, |
117 | .disable_vblank = i915_disable_vblank, | 143 | .disable_vblank = i915_disable_vblank, |
118 | .irq_preinstall = i915_driver_irq_preinstall, | 144 | .irq_preinstall = i915_driver_irq_preinstall, |