summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/device/pci_device.c18
-rw-r--r--src/include/device/pci.h1
2 files changed, 19 insertions, 0 deletions
diff --git a/src/device/pci_device.c b/src/device/pci_device.c
index a2ad2b3db9..d03d88df39 100644
--- a/src/device/pci_device.c
+++ b/src/device/pci_device.c
@@ -1346,6 +1346,24 @@ uint16_t pci_find_cap_recursive(const struct device *dev, uint16_t cap)
}
/**
+ * Returns if the device support PMEs.
+ *
+ * @param dev Pointer to the device structure.
+ * @return Returns true when the device support PMEs. The PME generation can be
+ * disabled though.
+ */
+bool pci_has_pme_pin(const struct device *dev)
+{
+ const uint16_t cap = pci_find_capability(dev, PCI_CAP_ID_PM);
+ if (!cap)
+ return false;
+
+ const uint16_t pmecap = pci_read_config16(dev, cap + PCI_PM_PMC);
+
+ return !!(pmecap & PCI_PM_CAP_PME);
+}
+
+/**
* PCI devices that are marked as "hidden" do not get probed. However, the same
* initialization logic is still performed as if it were. This is useful when
* devices would like to be described in the devicetree.cb file, and/or present
diff --git a/src/include/device/pci.h b/src/include/device/pci.h
index 2e7519554b..83d6628fa7 100644
--- a/src/include/device/pci.h
+++ b/src/include/device/pci.h
@@ -98,6 +98,7 @@ void pci_dev_set_subsystem(struct device *dev, unsigned int vendor,
void pci_dev_init(struct device *dev);
unsigned int pci_match_simple_dev(struct device *dev, pci_devfn_t sdev);
uint16_t pci_find_cap_recursive(const struct device *dev, uint16_t cap);
+bool pci_has_pme_pin(const struct device *dev);
const char *pin_to_str(int pin);
int get_pci_irq_pins(struct device *dev, struct device **parent_bdg);