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