linux/drivers/pci/pcie/pme.c
<<
>>
Prefs
   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 */
  35bool pcie_pme_msi_disabled;
  36
  37static 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
  46struct 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 */
  58void 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 */
  79static 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 */
 111static 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 */
 139static 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 */
 224static 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 */
 275static 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 */
 310static 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 */
 328static 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 */
 354static 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 */
 388static 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 */
 408static 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 */
 426static 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
 433static 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 */
 447static int __init pcie_pme_service_init(void)
 448{
 449        return pcie_port_service_register(&pcie_pme_driver);
 450}
 451
 452module_init(pcie_pme_service_init);
 453