Merge branch 'pci/aspm'
[linux-2.6-microblaze.git] / drivers / pci / pcie / pme.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * PCIe Native PME support
4  *
5  * Copyright (C) 2007 - 2009 Intel Corp
6  * Copyright (C) 2007 - 2009 Shaohua Li <shaohua.li@intel.com>
7  * Copyright (C) 2009 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc.
8  */
9
10 #include <linux/pci.h>
11 #include <linux/kernel.h>
12 #include <linux/errno.h>
13 #include <linux/slab.h>
14 #include <linux/init.h>
15 #include <linux/interrupt.h>
16 #include <linux/device.h>
17 #include <linux/pcieport_if.h>
18 #include <linux/pm_runtime.h>
19
20 #include "../pci.h"
21 #include "portdrv.h"
22
23 /*
24  * If this switch is set, MSI will not be used for PCIe PME signaling.  This
25  * causes the PCIe port driver to use INTx interrupts only, but it turns out
26  * that using MSI for PCIe PME signaling doesn't play well with PCIe PME-based
27  * wake-up from system sleep states.
28  */
29 bool pcie_pme_msi_disabled;
30
31 static int __init pcie_pme_setup(char *str)
32 {
33         if (!strncmp(str, "nomsi", 5))
34                 pcie_pme_msi_disabled = true;
35
36         return 1;
37 }
38 __setup("pcie_pme=", pcie_pme_setup);
39
40 struct pcie_pme_service_data {
41         spinlock_t lock;
42         struct pcie_device *srv;
43         struct work_struct work;
44         bool noirq; /* If set, keep the PME interrupt disabled. */
45 };
46
47 /**
48  * pcie_pme_interrupt_enable - Enable/disable PCIe PME interrupt generation.
49  * @dev: PCIe root port or event collector.
50  * @enable: Enable or disable the interrupt.
51  */
52 void pcie_pme_interrupt_enable(struct pci_dev *dev, bool enable)
53 {
54         if (enable)
55                 pcie_capability_set_word(dev, PCI_EXP_RTCTL,
56                                          PCI_EXP_RTCTL_PMEIE);
57         else
58                 pcie_capability_clear_word(dev, PCI_EXP_RTCTL,
59                                            PCI_EXP_RTCTL_PMEIE);
60 }
61
62 /**
63  * pcie_pme_walk_bus - Scan a PCI bus for devices asserting PME#.
64  * @bus: PCI bus to scan.
65  *
66  * Scan given PCI bus and all buses under it for devices asserting PME#.
67  */
68 static bool pcie_pme_walk_bus(struct pci_bus *bus)
69 {
70         struct pci_dev *dev;
71         bool ret = false;
72
73         list_for_each_entry(dev, &bus->devices, bus_list) {
74                 /* Skip PCIe devices in case we started from a root port. */
75                 if (!pci_is_pcie(dev) && pci_check_pme_status(dev)) {
76                         if (dev->pme_poll)
77                                 dev->pme_poll = false;
78
79                         pci_wakeup_event(dev);
80                         pm_request_resume(&dev->dev);
81                         ret = true;
82                 }
83
84                 if (dev->subordinate && pcie_pme_walk_bus(dev->subordinate))
85                         ret = true;
86         }
87
88         return ret;
89 }
90
91 /**
92  * pcie_pme_from_pci_bridge - Check if PCIe-PCI bridge generated a PME.
93  * @bus: Secondary bus of the bridge.
94  * @devfn: Device/function number to check.
95  *
96  * PME from PCI devices under a PCIe-PCI bridge may be converted to an in-band
97  * PCIe PME message.  In such that case the bridge should use the Requester ID
98  * of device/function number 0 on its secondary bus.
99  */
100 static bool pcie_pme_from_pci_bridge(struct pci_bus *bus, u8 devfn)
101 {
102         struct pci_dev *dev;
103         bool found = false;
104
105         if (devfn)
106                 return false;
107
108         dev = pci_dev_get(bus->self);
109         if (!dev)
110                 return false;
111
112         if (pci_is_pcie(dev) && pci_pcie_type(dev) == PCI_EXP_TYPE_PCI_BRIDGE) {
113                 down_read(&pci_bus_sem);
114                 if (pcie_pme_walk_bus(bus))
115                         found = true;
116                 up_read(&pci_bus_sem);
117         }
118
119         pci_dev_put(dev);
120         return found;
121 }
122
123 /**
124  * pcie_pme_handle_request - Find device that generated PME and handle it.
125  * @port: Root port or event collector that generated the PME interrupt.
126  * @req_id: PCIe Requester ID of the device that generated the PME.
127  */
128 static void pcie_pme_handle_request(struct pci_dev *port, u16 req_id)
129 {
130         u8 busnr = req_id >> 8, devfn = req_id & 0xff;
131         struct pci_bus *bus;
132         struct pci_dev *dev;
133         bool found = false;
134
135         /* First, check if the PME is from the root port itself. */
136         if (port->devfn == devfn && port->bus->number == busnr) {
137                 if (port->pme_poll)
138                         port->pme_poll = false;
139
140                 if (pci_check_pme_status(port)) {
141                         pm_request_resume(&port->dev);
142                         found = true;
143                 } else {
144                         /*
145                          * Apparently, the root port generated the PME on behalf
146                          * of a non-PCIe device downstream.  If this is done by
147                          * a root port, the Requester ID field in its status
148                          * register may contain either the root port's, or the
149                          * source device's information (PCI Express Base
150                          * Specification, Rev. 2.0, Section 6.1.9).
151                          */
152                         down_read(&pci_bus_sem);
153                         found = pcie_pme_walk_bus(port->subordinate);
154                         up_read(&pci_bus_sem);
155                 }
156                 goto out;
157         }
158
159         /* Second, find the bus the source device is on. */
160         bus = pci_find_bus(pci_domain_nr(port->bus), busnr);
161         if (!bus)
162                 goto out;
163
164         /* Next, check if the PME is from a PCIe-PCI bridge. */
165         found = pcie_pme_from_pci_bridge(bus, devfn);
166         if (found)
167                 goto out;
168
169         /* Finally, try to find the PME source on the bus. */
170         down_read(&pci_bus_sem);
171         list_for_each_entry(dev, &bus->devices, bus_list) {
172                 pci_dev_get(dev);
173                 if (dev->devfn == devfn) {
174                         found = true;
175                         break;
176                 }
177                 pci_dev_put(dev);
178         }
179         up_read(&pci_bus_sem);
180
181         if (found) {
182                 /* The device is there, but we have to check its PME status. */
183                 found = pci_check_pme_status(dev);
184                 if (found) {
185                         if (dev->pme_poll)
186                                 dev->pme_poll = false;
187
188                         pci_wakeup_event(dev);
189                         pm_request_resume(&dev->dev);
190                 }
191                 pci_dev_put(dev);
192         } else if (devfn) {
193                 /*
194                  * The device is not there, but we can still try to recover by
195                  * assuming that the PME was reported by a PCIe-PCI bridge that
196                  * used devfn different from zero.
197                  */
198                 pci_dbg(port, "PME interrupt generated for non-existent device %02x:%02x.%d\n",
199                         busnr, PCI_SLOT(devfn), PCI_FUNC(devfn));
200                 found = pcie_pme_from_pci_bridge(bus, 0);
201         }
202
203  out:
204         if (!found)
205                 pci_dbg(port, "Spurious native PME interrupt!\n");
206 }
207
208 /**
209  * pcie_pme_work_fn - Work handler for PCIe PME interrupt.
210  * @work: Work structure giving access to service data.
211  */
212 static void pcie_pme_work_fn(struct work_struct *work)
213 {
214         struct pcie_pme_service_data *data =
215                         container_of(work, struct pcie_pme_service_data, work);
216         struct pci_dev *port = data->srv->port;
217         u32 rtsta;
218
219         spin_lock_irq(&data->lock);
220
221         for (;;) {
222                 if (data->noirq)
223                         break;
224
225                 pcie_capability_read_dword(port, PCI_EXP_RTSTA, &rtsta);
226                 if (rtsta == (u32) ~0)
227                         break;
228
229                 if (rtsta & PCI_EXP_RTSTA_PME) {
230                         /*
231                          * Clear PME status of the port.  If there are other
232                          * pending PMEs, the status will be set again.
233                          */
234                         pcie_clear_root_pme_status(port);
235
236                         spin_unlock_irq(&data->lock);
237                         pcie_pme_handle_request(port, rtsta & 0xffff);
238                         spin_lock_irq(&data->lock);
239
240                         continue;
241                 }
242
243                 /* No need to loop if there are no more PMEs pending. */
244                 if (!(rtsta & PCI_EXP_RTSTA_PENDING))
245                         break;
246
247                 spin_unlock_irq(&data->lock);
248                 cpu_relax();
249                 spin_lock_irq(&data->lock);
250         }
251
252         if (!data->noirq)
253                 pcie_pme_interrupt_enable(port, true);
254
255         spin_unlock_irq(&data->lock);
256 }
257
258 /**
259  * pcie_pme_irq - Interrupt handler for PCIe root port PME interrupt.
260  * @irq: Interrupt vector.
261  * @context: Interrupt context pointer.
262  */
263 static irqreturn_t pcie_pme_irq(int irq, void *context)
264 {
265         struct pci_dev *port;
266         struct pcie_pme_service_data *data;
267         u32 rtsta;
268         unsigned long flags;
269
270         port = ((struct pcie_device *)context)->port;
271         data = get_service_data((struct pcie_device *)context);
272
273         spin_lock_irqsave(&data->lock, flags);
274         pcie_capability_read_dword(port, PCI_EXP_RTSTA, &rtsta);
275
276         if (rtsta == (u32) ~0 || !(rtsta & PCI_EXP_RTSTA_PME)) {
277                 spin_unlock_irqrestore(&data->lock, flags);
278                 return IRQ_NONE;
279         }
280
281         pcie_pme_interrupt_enable(port, false);
282         spin_unlock_irqrestore(&data->lock, flags);
283
284         /* We don't use pm_wq, because it's freezable. */
285         schedule_work(&data->work);
286
287         return IRQ_HANDLED;
288 }
289
290 /**
291  * pcie_pme_can_wakeup - Set the wakeup capability flag.
292  * @dev: PCI device to handle.
293  * @ign: Ignored.
294  */
295 static int pcie_pme_can_wakeup(struct pci_dev *dev, void *ign)
296 {
297         device_set_wakeup_capable(&dev->dev, true);
298         return 0;
299 }
300
301 /**
302  * pcie_pme_mark_devices - Set the wakeup flag for devices below a port.
303  * @port: PCIe root port or event collector to handle.
304  *
305  * For each device below given root port, including the port itself (or for each
306  * root complex integrated endpoint if @port is a root complex event collector)
307  * set the flag indicating that it can signal run-time wake-up events.
308  */
309 static void pcie_pme_mark_devices(struct pci_dev *port)
310 {
311         pcie_pme_can_wakeup(port, NULL);
312         if (port->subordinate)
313                 pci_walk_bus(port->subordinate, pcie_pme_can_wakeup, NULL);
314 }
315
316 /**
317  * pcie_pme_probe - Initialize PCIe PME service for given root port.
318  * @srv: PCIe service to initialize.
319  */
320 static int pcie_pme_probe(struct pcie_device *srv)
321 {
322         struct pci_dev *port;
323         struct pcie_pme_service_data *data;
324         int ret;
325
326         data = kzalloc(sizeof(*data), GFP_KERNEL);
327         if (!data)
328                 return -ENOMEM;
329
330         spin_lock_init(&data->lock);
331         INIT_WORK(&data->work, pcie_pme_work_fn);
332         data->srv = srv;
333         set_service_data(srv, data);
334
335         port = srv->port;
336         pcie_pme_interrupt_enable(port, false);
337         pcie_clear_root_pme_status(port);
338
339         ret = request_irq(srv->irq, pcie_pme_irq, IRQF_SHARED, "PCIe PME", srv);
340         if (ret) {
341                 kfree(data);
342                 return ret;
343         }
344
345         pci_info(port, "Signaling PME with IRQ %d\n", srv->irq);
346
347         pcie_pme_mark_devices(port);
348         pcie_pme_interrupt_enable(port, true);
349         return 0;
350 }
351
352 static bool pcie_pme_check_wakeup(struct pci_bus *bus)
353 {
354         struct pci_dev *dev;
355
356         if (!bus)
357                 return false;
358
359         list_for_each_entry(dev, &bus->devices, bus_list)
360                 if (device_may_wakeup(&dev->dev)
361                     || pcie_pme_check_wakeup(dev->subordinate))
362                         return true;
363
364         return false;
365 }
366
367 /**
368  * pcie_pme_suspend - Suspend PCIe PME service device.
369  * @srv: PCIe service device to suspend.
370  */
371 static int pcie_pme_suspend(struct pcie_device *srv)
372 {
373         struct pcie_pme_service_data *data = get_service_data(srv);
374         struct pci_dev *port = srv->port;
375         bool wakeup;
376         int ret;
377
378         if (device_may_wakeup(&port->dev)) {
379                 wakeup = true;
380         } else {
381                 down_read(&pci_bus_sem);
382                 wakeup = pcie_pme_check_wakeup(port->subordinate);
383                 up_read(&pci_bus_sem);
384         }
385         if (wakeup) {
386                 ret = enable_irq_wake(srv->irq);
387                 if (!ret)
388                         return 0;
389         }
390
391         spin_lock_irq(&data->lock);
392         pcie_pme_interrupt_enable(port, false);
393         pcie_clear_root_pme_status(port);
394         data->noirq = true;
395         spin_unlock_irq(&data->lock);
396
397         synchronize_irq(srv->irq);
398
399         return 0;
400 }
401
402 /**
403  * pcie_pme_resume - Resume PCIe PME service device.
404  * @srv - PCIe service device to resume.
405  */
406 static int pcie_pme_resume(struct pcie_device *srv)
407 {
408         struct pcie_pme_service_data *data = get_service_data(srv);
409
410         spin_lock_irq(&data->lock);
411         if (data->noirq) {
412                 struct pci_dev *port = srv->port;
413
414                 pcie_clear_root_pme_status(port);
415                 pcie_pme_interrupt_enable(port, true);
416                 data->noirq = false;
417         } else {
418                 disable_irq_wake(srv->irq);
419         }
420         spin_unlock_irq(&data->lock);
421
422         return 0;
423 }
424
425 /**
426  * pcie_pme_remove - Prepare PCIe PME service device for removal.
427  * @srv - PCIe service device to remove.
428  */
429 static void pcie_pme_remove(struct pcie_device *srv)
430 {
431         pcie_pme_suspend(srv);
432         free_irq(srv->irq, srv);
433         kfree(get_service_data(srv));
434 }
435
436 static struct pcie_port_service_driver pcie_pme_driver = {
437         .name           = "pcie_pme",
438         .port_type      = PCI_EXP_TYPE_ROOT_PORT,
439         .service        = PCIE_PORT_SERVICE_PME,
440
441         .probe          = pcie_pme_probe,
442         .suspend        = pcie_pme_suspend,
443         .resume         = pcie_pme_resume,
444         .remove         = pcie_pme_remove,
445 };
446
447 /**
448  * pcie_pme_service_init - Register the PCIe PME service driver.
449  */
450 static int __init pcie_pme_service_init(void)
451 {
452         return pcie_port_service_register(&pcie_pme_driver);
453 }
454 device_initcall(pcie_pme_service_init);