Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 094e0fa8 authored by Thomas Hellstrom's avatar Thomas Hellstrom Committed by Dave Airlie
Browse files

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: default avatarThomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent d3216a0c
Loading
Loading
Loading
Loading
+36 −2
Original line number Diff line number Diff line
@@ -751,15 +751,40 @@ static int vmwgfx_pm_notifier(struct notifier_block *nb, unsigned long val,
		 * Buffer contents is moved to swappable memory.
		 */
		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;
	case PM_POST_HIBERNATION:
	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);

		break;
	case PM_RESTORE_PREPARE:
		break;
	case PM_POST_RESTORE:
		break;
	default:
		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)
{
	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_disable_device(pdev);
	pci_set_power_state(pdev, PCI_D3hot);
+1 −0
Original line number Diff line number Diff line
@@ -286,6 +286,7 @@ struct vmw_private {
	struct vmw_master *active_master;
	struct vmw_master fbdev_master;
	struct notifier_block pm_nb;
	bool suspended;

	struct mutex release_mutex;
	uint32_t num_3d_resources;