diff options
author | Dave Airlie <airlied@redhat.com> | 2010-12-06 18:20:40 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-01-04 22:45:30 -0500 |
commit | 5bcf719b7db0f9366cedaf102b081f99b1c325ae (patch) | |
tree | 6929d42e1d61a3b1bd7b130a37a80b99718e14aa /drivers/gpu/drm/i915/i915_drv.c | |
parent | 8d608aa6295242fe4c4b6105b8c59c6a5b232d89 (diff) |
drm/switcheroo: track state of switch in drivers.
We need to track the state of the switch in drivers, so that after s/r
we don't resume the card we've explicitly switched off before. Also
don't allow a userspace open to occur if we've switched the gpu off.
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_drv.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 9eee6cf7901e..872493331988 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -271,6 +271,8 @@ static int i915_drm_freeze(struct drm_device *dev) | |||
271 | { | 271 | { |
272 | struct drm_i915_private *dev_priv = dev->dev_private; | 272 | struct drm_i915_private *dev_priv = dev->dev_private; |
273 | 273 | ||
274 | drm_kms_helper_poll_disable(dev); | ||
275 | |||
274 | pci_save_state(dev->pdev); | 276 | pci_save_state(dev->pdev); |
275 | 277 | ||
276 | /* If KMS is active, we do the leavevt stuff here */ | 278 | /* If KMS is active, we do the leavevt stuff here */ |
@@ -307,7 +309,9 @@ int i915_suspend(struct drm_device *dev, pm_message_t state) | |||
307 | if (state.event == PM_EVENT_PRETHAW) | 309 | if (state.event == PM_EVENT_PRETHAW) |
308 | return 0; | 310 | return 0; |
309 | 311 | ||
310 | drm_kms_helper_poll_disable(dev); | 312 | |
313 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) | ||
314 | return 0; | ||
311 | 315 | ||
312 | error = i915_drm_freeze(dev); | 316 | error = i915_drm_freeze(dev); |
313 | if (error) | 317 | if (error) |
@@ -361,6 +365,9 @@ int i915_resume(struct drm_device *dev) | |||
361 | { | 365 | { |
362 | int ret; | 366 | int ret; |
363 | 367 | ||
368 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) | ||
369 | return 0; | ||
370 | |||
364 | if (pci_enable_device(dev->pdev)) | 371 | if (pci_enable_device(dev->pdev)) |
365 | return -EIO; | 372 | return -EIO; |
366 | 373 | ||
@@ -569,6 +576,9 @@ static int i915_pm_suspend(struct device *dev) | |||
569 | return -ENODEV; | 576 | return -ENODEV; |
570 | } | 577 | } |
571 | 578 | ||
579 | if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF) | ||
580 | return 0; | ||
581 | |||
572 | error = i915_drm_freeze(drm_dev); | 582 | error = i915_drm_freeze(drm_dev); |
573 | if (error) | 583 | if (error) |
574 | return error; | 584 | return error; |