pme.c (11655B)
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 */ 30bool pcie_pme_msi_disabled; 31 32static 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 41struct 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 */ 53void 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 */ 69static 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 */ 101static 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 */ 129static 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 */ 213static 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 (PCI_POSSIBLE_ERROR(rtsta)) 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 */ 264static 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 (PCI_POSSIBLE_ERROR(rtsta) || !(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 */ 296static 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 */ 310static void pcie_pme_mark_devices(struct pci_dev *port) 311{ 312 pcie_pme_can_wakeup(port, NULL); 313 314 if (pci_pcie_type(port) == PCI_EXP_TYPE_RC_EC) 315 pcie_walk_rcec(port, pcie_pme_can_wakeup, NULL); 316 else if (port->subordinate) 317 pci_walk_bus(port->subordinate, pcie_pme_can_wakeup, NULL); 318} 319 320/** 321 * pcie_pme_probe - Initialize PCIe PME service for given root port. 322 * @srv: PCIe service to initialize. 323 */ 324static int pcie_pme_probe(struct pcie_device *srv) 325{ 326 struct pci_dev *port = srv->port; 327 struct pcie_pme_service_data *data; 328 int type = pci_pcie_type(port); 329 int ret; 330 331 /* Limit to Root Ports or Root Complex Event Collectors */ 332 if (type != PCI_EXP_TYPE_RC_EC && 333 type != PCI_EXP_TYPE_ROOT_PORT) 334 return -ENODEV; 335 336 data = kzalloc(sizeof(*data), GFP_KERNEL); 337 if (!data) 338 return -ENOMEM; 339 340 spin_lock_init(&data->lock); 341 INIT_WORK(&data->work, pcie_pme_work_fn); 342 data->srv = srv; 343 set_service_data(srv, data); 344 345 pcie_pme_interrupt_enable(port, false); 346 pcie_clear_root_pme_status(port); 347 348 ret = request_irq(srv->irq, pcie_pme_irq, IRQF_SHARED, "PCIe PME", srv); 349 if (ret) { 350 kfree(data); 351 return ret; 352 } 353 354 pci_info(port, "Signaling with IRQ %d\n", srv->irq); 355 356 pcie_pme_mark_devices(port); 357 pcie_pme_interrupt_enable(port, true); 358 return 0; 359} 360 361static bool pcie_pme_check_wakeup(struct pci_bus *bus) 362{ 363 struct pci_dev *dev; 364 365 if (!bus) 366 return false; 367 368 list_for_each_entry(dev, &bus->devices, bus_list) 369 if (device_may_wakeup(&dev->dev) 370 || pcie_pme_check_wakeup(dev->subordinate)) 371 return true; 372 373 return false; 374} 375 376static void pcie_pme_disable_interrupt(struct pci_dev *port, 377 struct pcie_pme_service_data *data) 378{ 379 spin_lock_irq(&data->lock); 380 pcie_pme_interrupt_enable(port, false); 381 pcie_clear_root_pme_status(port); 382 data->noirq = true; 383 spin_unlock_irq(&data->lock); 384} 385 386/** 387 * pcie_pme_suspend - Suspend PCIe PME service device. 388 * @srv: PCIe service device to suspend. 389 */ 390static int pcie_pme_suspend(struct pcie_device *srv) 391{ 392 struct pcie_pme_service_data *data = get_service_data(srv); 393 struct pci_dev *port = srv->port; 394 bool wakeup; 395 int ret; 396 397 if (device_may_wakeup(&port->dev)) { 398 wakeup = true; 399 } else { 400 down_read(&pci_bus_sem); 401 wakeup = pcie_pme_check_wakeup(port->subordinate); 402 up_read(&pci_bus_sem); 403 } 404 if (wakeup) { 405 ret = enable_irq_wake(srv->irq); 406 if (!ret) 407 return 0; 408 } 409 410 pcie_pme_disable_interrupt(port, data); 411 412 synchronize_irq(srv->irq); 413 414 return 0; 415} 416 417/** 418 * pcie_pme_resume - Resume PCIe PME service device. 419 * @srv: PCIe service device to resume. 420 */ 421static int pcie_pme_resume(struct pcie_device *srv) 422{ 423 struct pcie_pme_service_data *data = get_service_data(srv); 424 425 spin_lock_irq(&data->lock); 426 if (data->noirq) { 427 struct pci_dev *port = srv->port; 428 429 pcie_clear_root_pme_status(port); 430 pcie_pme_interrupt_enable(port, true); 431 data->noirq = false; 432 } else { 433 disable_irq_wake(srv->irq); 434 } 435 spin_unlock_irq(&data->lock); 436 437 return 0; 438} 439 440/** 441 * pcie_pme_remove - Prepare PCIe PME service device for removal. 442 * @srv: PCIe service device to remove. 443 */ 444static void pcie_pme_remove(struct pcie_device *srv) 445{ 446 struct pcie_pme_service_data *data = get_service_data(srv); 447 448 pcie_pme_disable_interrupt(srv->port, data); 449 free_irq(srv->irq, srv); 450 cancel_work_sync(&data->work); 451 kfree(data); 452} 453 454static struct pcie_port_service_driver pcie_pme_driver = { 455 .name = "pcie_pme", 456 .port_type = PCIE_ANY_PORT, 457 .service = PCIE_PORT_SERVICE_PME, 458 459 .probe = pcie_pme_probe, 460 .suspend = pcie_pme_suspend, 461 .resume = pcie_pme_resume, 462 .remove = pcie_pme_remove, 463}; 464 465/** 466 * pcie_pme_init - Register the PCIe PME service driver. 467 */ 468int __init pcie_pme_init(void) 469{ 470 return pcie_port_service_register(&pcie_pme_driver); 471}