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