13 #include <linux/module.h>
14 #include <linux/pci.h>
15 #include <linux/kernel.h>
16 #include <linux/errno.h>
17 #include <linux/slab.h>
20 #include <linux/device.h>
37 static int __init pcie_pme_setup(
char *
str)
44 __setup(
"pcie_pme=", pcie_pme_setup);
74 static bool pcie_pme_walk_bus(
struct pci_bus *
bus)
85 pci_wakeup_event(dev);
86 pm_request_resume(&dev->
dev);
106 static bool pcie_pme_from_pci_bridge(
struct pci_bus *bus,
u8 devfn)
120 if (pcie_pme_walk_bus(bus))
136 u8 busnr = req_id >> 8, devfn = req_id & 0xff;
142 if (port->
devfn == devfn && port->
bus->number == busnr) {
147 pm_request_resume(&port->
dev);
171 found = pcie_pme_from_pci_bridge(bus, devfn);
179 if (dev->
devfn == devfn) {
194 pci_wakeup_event(dev);
195 pm_request_resume(&dev->
dev);
204 dev_dbg(&port->
dev,
"PME interrupt generated for "
205 "non-existent device %02x:%02x.%d\n",
207 found = pcie_pme_from_pci_bridge(bus, 0);
212 dev_dbg(&port->
dev,
"Spurious native PME interrupt!\n");
226 spin_lock_irq(&data->
lock);
240 spin_unlock_irq(&data->
lock);
241 pcie_pme_handle_request(port, rtsta & 0xffff);
242 spin_lock_irq(&data->
lock);
251 spin_unlock_irq(&data->
lock);
253 spin_lock_irq(&data->
lock);
259 spin_unlock_irq(&data->
lock);
275 data = get_service_data((
struct pcie_device *)context);
280 if (!(rtsta & PCI_EXP_RTSTA_PME)) {
281 spin_unlock_irqrestore(&data->
lock, flags);
286 spin_unlock_irqrestore(&data->
lock, flags);
299 static int pcie_pme_set_native(
struct pci_dev *dev,
void *ign)
301 dev_info(&dev->
dev,
"Signaling PME through PCIe PME interrupt\n");
303 device_set_run_wake(&dev->
dev,
true);
317 static void pcie_pme_mark_devices(
struct pci_dev *port)
319 pcie_pme_set_native(port,
NULL);
334 pcie_pme_set_native(dev,
NULL);
356 set_service_data(srv, data);
366 pcie_pme_mark_devices(port);
377 static int pcie_pme_suspend(
struct pcie_device *srv)
382 spin_lock_irq(&data->
lock);
386 spin_unlock_irq(&data->
lock);
397 static int pcie_pme_resume(
struct pcie_device *srv)
402 spin_lock_irq(&data->
lock);
406 spin_unlock_irq(&data->
lock);
415 static void pcie_pme_remove(
struct pcie_device *srv)
417 pcie_pme_suspend(srv);
419 kfree(get_service_data(srv));
427 .probe = pcie_pme_probe,
428 .suspend = pcie_pme_suspend,
429 .resume = pcie_pme_resume,
430 .remove = pcie_pme_remove,
436 static int __init pcie_pme_service_init(
void)