12 #include <linux/pci.h>
13 #include <linux/module.h>
44 static void pci_acpi_wake_dev(
acpi_handle handle,
u32 event,
void *context)
52 pci_wakeup_event(pci_dev);
53 pm_runtime_resume(&pci_dev->
dev);
62 pci_wakeup_event(pci_dev);
63 pm_runtime_resume(&pci_dev->
dev);
88 if (dev->wakeup.flags.notifier_present)
97 dev->wakeup.flags.notifier_present =
true;
108 static acpi_status remove_pm_notifier(
struct acpi_device *dev,
115 if (!dev->wakeup.flags.notifier_present)
124 dev->wakeup.flags.notifier_present =
false;
137 struct pci_bus *pci_bus)
139 return add_pm_notifier(dev, pci_acpi_wake_bus, pci_bus);
148 return remove_pm_notifier(dev, pci_acpi_wake_bus);
157 struct pci_dev *pci_dev)
159 return add_pm_notifier(dev, pci_acpi_wake_dev, pci_dev);
168 return remove_pm_notifier(dev, pci_acpi_wake_dev);
174 unsigned long long mcfg_addr;
208 static pci_power_t acpi_pci_choose_state(
struct pci_dev *pdev)
210 int acpi_state, d_max;
216 acpi_state = acpi_pm_device_sleep_state(&pdev->
dev,
NULL, d_max);
220 switch (acpi_state) {
235 static bool acpi_pci_power_manageable(
struct pci_dev *dev)
246 static const u8 state_conv[] = {
269 dev_info(&dev->
dev,
"power state changed by ACPI to %s\n",
270 pci_power_name(state));
275 static bool acpi_pci_can_wakeup(
struct pci_dev *dev)
282 static void acpi_pci_propagate_wakeup_enable(
struct pci_bus *
bus,
bool enable)
285 if (!acpi_pm_device_sleep_wake(&bus->
self->dev, enable))
292 acpi_pm_device_sleep_wake(bus->
bridge, enable);
295 static int acpi_pci_sleep_wake(
struct pci_dev *dev,
bool enable)
297 if (acpi_pci_can_wakeup(dev))
298 return acpi_pm_device_sleep_wake(&dev->
dev, enable);
300 acpi_pci_propagate_wakeup_enable(dev->
bus, enable);
304 static void acpi_pci_propagate_run_wake(
struct pci_bus *bus,
bool enable)
311 if (!acpi_pm_device_run_wake(&bridge->
dev, enable))
318 acpi_pm_device_run_wake(bus->
bridge, enable);
321 static int acpi_pci_run_wake(
struct pci_dev *dev,
bool enable)
332 if (!acpi_pm_device_run_wake(&dev->
dev, enable))
335 acpi_pci_propagate_run_wake(dev->
bus, enable);
340 .is_manageable = acpi_pci_power_manageable,
341 .set_state = acpi_pci_set_power_state,
342 .choose_state = acpi_pci_choose_state,
343 .can_wakeup = acpi_pci_can_wakeup,
344 .sleep_wake = acpi_pci_sleep_wake,
345 .run_wake = acpi_pci_run_wake,
372 num =
sscanf(dev_name(dev),
"pci%04x:%02x", &seg, &bus);
383 .find_device = acpi_pci_find_device,
384 .find_bridge = acpi_pci_find_root_bridge,
387 static int __init acpi_pci_init(
void)
392 printk(
KERN_INFO"ACPI FADT declares the system doesn't support MSI, so disable it\n");
397 printk(
KERN_INFO"ACPI FADT declares the system doesn't support PCIe ASPM, so disable it\n");