drm/vmwgfx: Fix ACPI S3 & S4 functionality.

Don't suspend or hibernate when there are 3D resources active since we
can't restore the device's 3D state. Instead fail with an error message.

In other cases, make sure we re-enable the fifo and unlock ttm on resume.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Thomas Hellstrom 2010-10-05 12:43:00 +02:00 committed by Dave Airlie
parent d3216a0c31
commit 094e0fa8b9
2 changed files with 37 additions and 2 deletions

View File

@ -751,15 +751,40 @@ static int vmwgfx_pm_notifier(struct notifier_block *nb, unsigned long val,
* Buffer contents is moved to swappable memory. * Buffer contents is moved to swappable memory.
*/ */
ttm_bo_swapout_all(&dev_priv->bdev); ttm_bo_swapout_all(&dev_priv->bdev);
/**
* Release 3d reference held by fbdev and potentially
* stop fifo.
*/
dev_priv->suspended = true;
if (dev_priv->enable_fb)
vmw_3d_resource_dec(dev_priv);
break; break;
case PM_POST_HIBERNATION: case PM_POST_HIBERNATION:
case PM_POST_SUSPEND: case PM_POST_SUSPEND:
case PM_POST_RESTORE:
if (!dev_priv->suspended) {
printk(KERN_WARNING
"[%s] Driver is not suspended at resume"
" point.\n", VMWGFX_DRIVER_NAME);
break;
}
/**
* Reclaim 3d reference held by fbdev and potentially
* start fifo.
*/
if (dev_priv->enable_fb)
vmw_3d_resource_inc(dev_priv);
dev_priv->suspended = false;
ttm_suspend_unlock(&vmaster->lock); ttm_suspend_unlock(&vmaster->lock);
break; break;
case PM_RESTORE_PREPARE: case PM_RESTORE_PREPARE:
break; break;
case PM_POST_RESTORE:
break;
default: default:
break; break;
} }
@ -772,6 +797,15 @@ static int vmwgfx_pm_notifier(struct notifier_block *nb, unsigned long val,
int vmw_pci_suspend(struct pci_dev *pdev, pm_message_t state) int vmw_pci_suspend(struct pci_dev *pdev, pm_message_t state)
{ {
struct drm_device *dev = pci_get_drvdata(pdev);
struct vmw_private *dev_priv = vmw_priv(dev);
if (dev_priv->num_3d_resources != 0) {
DRM_INFO("Can't suspend or hibernate "
"while 3D resources are active.\n");
return -EBUSY;
}
pci_save_state(pdev); pci_save_state(pdev);
pci_disable_device(pdev); pci_disable_device(pdev);
pci_set_power_state(pdev, PCI_D3hot); pci_set_power_state(pdev, PCI_D3hot);

View File

@ -286,6 +286,7 @@ struct vmw_private {
struct vmw_master *active_master; struct vmw_master *active_master;
struct vmw_master fbdev_master; struct vmw_master fbdev_master;
struct notifier_block pm_nb; struct notifier_block pm_nb;
bool suspended;
struct mutex release_mutex; struct mutex release_mutex;
uint32_t num_3d_resources; uint32_t num_3d_resources;