summaryrefslogtreecommitdiffstats
path: root/src/device/pci_ops.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/device/pci_ops.c')
-rw-r--r--src/device/pci_ops.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/device/pci_ops.c b/src/device/pci_ops.c
index 90f45bf21a61..aaa9f95fb1f4 100644
--- a/src/device/pci_ops.c
+++ b/src/device/pci_ops.c
@@ -78,3 +78,21 @@ void __noreturn pcidev_die(void)
{
die("PCI: dev is NULL!\n");
}
+
+bool pci_dev_is_wake_source(const struct device *dev)
+{
+ unsigned int pm_cap;
+ uint16_t pmcs;
+
+ if (dev->path.type != DEVICE_PATH_PCI)
+ return false;
+
+ pm_cap = pci_find_capability(dev, PCI_CAP_ID_PM);
+ if (!pm_cap)
+ return false;
+
+ pmcs = pci_s_read_config16(PCI_BDF(dev), pm_cap + PCI_PM_CTRL);
+
+ /* PCI Device is a wake source if PME_ENABLE and PME_STATUS are set in PMCS register. */
+ return (pmcs & PCI_PM_CTRL_PME_ENABLE) && (pmcs & PCI_PM_CTRL_PME_STATUS);
+}