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