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); 455