UPSTREAM: virtio: Add support for no-reset virtio PCI PM
If a virtio_pci_device supports native PCI power management and has the No_Soft_Reset bit set, then skip resetting and reinitializing the device when suspending and restoring the device. This allows system-wide low power states like s2idle to be used in systems with stateful virtio devices that can't simply be re-initialized (e.g. virtio-fs). Signed-off-by: David Stevens <stevensd@chromium.org> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Bug: 318540621 Change-Id: Ifc60f72a6a6bd256fa14e291e615c7514dcb4d7d (cherry picked from commit dff4fa0e57856045359440d05af9e9b7f7048f52) Signed-off-by: Philip Chen <philipchen@google.com> (cherry picked from commit a7dcf250aeb8e2a572774a0e51fc0432875b6661)
This commit is contained in:
parent
7dc3b2e49e
commit
b86713e341
@ -492,8 +492,40 @@ static int virtio_pci_restore(struct device *dev)
|
||||
return virtio_device_restore(&vp_dev->vdev);
|
||||
}
|
||||
|
||||
static bool vp_supports_pm_no_reset(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pci_dev = to_pci_dev(dev);
|
||||
u16 pmcsr;
|
||||
|
||||
if (!pci_dev->pm_cap)
|
||||
return false;
|
||||
|
||||
pci_read_config_word(pci_dev, pci_dev->pm_cap + PCI_PM_CTRL, &pmcsr);
|
||||
if (PCI_POSSIBLE_ERROR(pmcsr)) {
|
||||
dev_err(dev, "Unable to query pmcsr");
|
||||
return false;
|
||||
}
|
||||
|
||||
return pmcsr & PCI_PM_CTRL_NO_SOFT_RESET;
|
||||
}
|
||||
|
||||
static int virtio_pci_suspend(struct device *dev)
|
||||
{
|
||||
return vp_supports_pm_no_reset(dev) ? 0 : virtio_pci_freeze(dev);
|
||||
}
|
||||
|
||||
static int virtio_pci_resume(struct device *dev)
|
||||
{
|
||||
return vp_supports_pm_no_reset(dev) ? 0 : virtio_pci_restore(dev);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops virtio_pci_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(virtio_pci_freeze, virtio_pci_restore)
|
||||
.suspend = virtio_pci_suspend,
|
||||
.resume = virtio_pci_resume,
|
||||
.freeze = virtio_pci_freeze,
|
||||
.thaw = virtio_pci_restore,
|
||||
.poweroff = virtio_pci_freeze,
|
||||
.restore = virtio_pci_restore,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user