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