linux/drivers/pci/pcie/portdrv_core.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Purpose:     PCI Express Port Bus Driver's Core Functions
   4 *
   5 * Copyright (C) 2004 Intel
   6 * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
   7 */
   8
   9#include <linux/module.h>
  10#include <linux/pci.h>
  11#include <linux/kernel.h>
  12#include <linux/errno.h>
  13#include <linux/pm.h>
  14#include <linux/pm_runtime.h>
  15#include <linux/string.h>
  16#include <linux/slab.h>
  17#include <linux/aer.h>
  18
  19#include "../pci.h"
  20#include "portdrv.h"
  21
  22struct portdrv_service_data {
  23        struct pcie_port_service_driver *drv;
  24        struct device *dev;
  25        u32 service;
  26};
  27
  28/**
  29 * release_pcie_device - free PCI Express port service device structure
  30 * @dev: Port service device to release
  31 *
  32 * Invoked automatically when device is being removed in response to
  33 * device_unregister(dev).  Release all resources being claimed.
  34 */
  35static void release_pcie_device(struct device *dev)
  36{
  37        kfree(to_pcie_device(dev));
  38}
  39
  40/*
  41 * Fill in *pme, *aer, *dpc with the relevant Interrupt Message Numbers if
  42 * services are enabled in "mask".  Return the number of MSI/MSI-X vectors
  43 * required to accommodate the largest Message Number.
  44 */
  45static int pcie_message_numbers(struct pci_dev *dev, int mask,
  46                                u32 *pme, u32 *aer, u32 *dpc)
  47{
  48        u32 nvec = 0, pos;
  49        u16 reg16;
  50
  51        /*
  52         * The Interrupt Message Number indicates which vector is used, i.e.,
  53         * the MSI-X table entry or the MSI offset between the base Message
  54         * Data and the generated interrupt message.  See PCIe r3.1, sec
  55         * 7.8.2, 7.10.10, 7.31.2.
  56         */
  57
  58        if (mask & (PCIE_PORT_SERVICE_PME | PCIE_PORT_SERVICE_HP |
  59                    PCIE_PORT_SERVICE_BWNOTIF)) {
  60                pcie_capability_read_word(dev, PCI_EXP_FLAGS, &reg16);
  61                *pme = (reg16 & PCI_EXP_FLAGS_IRQ) >> 9;
  62                nvec = *pme + 1;
  63        }
  64
  65#ifdef CONFIG_PCIEAER
  66        if (mask & PCIE_PORT_SERVICE_AER) {
  67                u32 reg32;
  68
  69                pos = dev->aer_cap;
  70                if (pos) {
  71                        pci_read_config_dword(dev, pos + PCI_ERR_ROOT_STATUS,
  72                                              &reg32);
  73                        *aer = (reg32 & PCI_ERR_ROOT_AER_IRQ) >> 27;
  74                        nvec = max(nvec, *aer + 1);
  75                }
  76        }
  77#endif
  78
  79        if (mask & PCIE_PORT_SERVICE_DPC) {
  80                pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_DPC);
  81                if (pos) {
  82                        pci_read_config_word(dev, pos + PCI_EXP_DPC_CAP,
  83                                             &reg16);
  84                        *dpc = reg16 & PCI_EXP_DPC_IRQ;
  85                        nvec = max(nvec, *dpc + 1);
  86                }
  87        }
  88
  89        return nvec;
  90}
  91
  92/**
  93 * pcie_port_enable_irq_vec - try to set up MSI-X or MSI as interrupt mode
  94 * for given port
  95 * @dev: PCI Express port to handle
  96 * @irqs: Array of interrupt vectors to populate
  97 * @mask: Bitmask of port capabilities returned by get_port_device_capability()
  98 *
  99 * Return value: 0 on success, error code on failure
 100 */
 101static int pcie_port_enable_irq_vec(struct pci_dev *dev, int *irqs, int mask)
 102{
 103        int nr_entries, nvec, pcie_irq;
 104        u32 pme = 0, aer = 0, dpc = 0;
 105
 106        /* Allocate the maximum possible number of MSI/MSI-X vectors */
 107        nr_entries = pci_alloc_irq_vectors(dev, 1, PCIE_PORT_MAX_MSI_ENTRIES,
 108                        PCI_IRQ_MSIX | PCI_IRQ_MSI);
 109        if (nr_entries < 0)
 110                return nr_entries;
 111
 112        /* See how many and which Interrupt Message Numbers we actually use */
 113        nvec = pcie_message_numbers(dev, mask, &pme, &aer, &dpc);
 114        if (nvec > nr_entries) {
 115                pci_free_irq_vectors(dev);
 116                return -EIO;
 117        }
 118
 119        /*
 120         * If we allocated more than we need, free them and reallocate fewer.
 121         *
 122         * Reallocating may change the specific vectors we get, so
 123         * pci_irq_vector() must be done *after* the reallocation.
 124         *
 125         * If we're using MSI, hardware is *allowed* to change the Interrupt
 126         * Message Numbers when we free and reallocate the vectors, but we
 127         * assume it won't because we allocate enough vectors for the
 128         * biggest Message Number we found.
 129         */
 130        if (nvec != nr_entries) {
 131                pci_free_irq_vectors(dev);
 132
 133                nr_entries = pci_alloc_irq_vectors(dev, nvec, nvec,
 134                                PCI_IRQ_MSIX | PCI_IRQ_MSI);
 135                if (nr_entries < 0)
 136                        return nr_entries;
 137        }
 138
 139        /* PME, hotplug and bandwidth notification share an MSI/MSI-X vector */
 140        if (mask & (PCIE_PORT_SERVICE_PME | PCIE_PORT_SERVICE_HP |
 141                    PCIE_PORT_SERVICE_BWNOTIF)) {
 142                pcie_irq = pci_irq_vector(dev, pme);
 143                irqs[PCIE_PORT_SERVICE_PME_SHIFT] = pcie_irq;
 144                irqs[PCIE_PORT_SERVICE_HP_SHIFT] = pcie_irq;
 145                irqs[PCIE_PORT_SERVICE_BWNOTIF_SHIFT] = pcie_irq;
 146        }
 147
 148        if (mask & PCIE_PORT_SERVICE_AER)
 149                irqs[PCIE_PORT_SERVICE_AER_SHIFT] = pci_irq_vector(dev, aer);
 150
 151        if (mask & PCIE_PORT_SERVICE_DPC)
 152                irqs[PCIE_PORT_SERVICE_DPC_SHIFT] = pci_irq_vector(dev, dpc);
 153
 154        return 0;
 155}
 156
 157/**
 158 * pcie_init_service_irqs - initialize irqs for PCI Express port services
 159 * @dev: PCI Express port to handle
 160 * @irqs: Array of irqs to populate
 161 * @mask: Bitmask of port capabilities returned by get_port_device_capability()
 162 *
 163 * Return value: Interrupt mode associated with the port
 164 */
 165static int pcie_init_service_irqs(struct pci_dev *dev, int *irqs, int mask)
 166{
 167        int ret, i;
 168
 169        for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++)
 170                irqs[i] = -1;
 171
 172        /*
 173         * If we support PME but can't use MSI/MSI-X for it, we have to
 174         * fall back to INTx or other interrupts, e.g., a system shared
 175         * interrupt.
 176         */
 177        if ((mask & PCIE_PORT_SERVICE_PME) && pcie_pme_no_msi())
 178                goto legacy_irq;
 179
 180        /* Try to use MSI-X or MSI if supported */
 181        if (pcie_port_enable_irq_vec(dev, irqs, mask) == 0)
 182                return 0;
 183
 184legacy_irq:
 185        /* fall back to legacy IRQ */
 186        ret = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_LEGACY);
 187        if (ret < 0)
 188                return -ENODEV;
 189
 190        for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++)
 191                irqs[i] = pci_irq_vector(dev, 0);
 192
 193        return 0;
 194}
 195
 196/**
 197 * get_port_device_capability - discover capabilities of a PCI Express port
 198 * @dev: PCI Express port to examine
 199 *
 200 * The capabilities are read from the port's PCI Express configuration registers
 201 * as described in PCI Express Base Specification 1.0a sections 7.8.2, 7.8.9 and
 202 * 7.9 - 7.11.
 203 *
 204 * Return value: Bitmask of discovered port capabilities
 205 */
 206static int get_port_device_capability(struct pci_dev *dev)
 207{
 208        struct pci_host_bridge *host = pci_find_host_bridge(dev->bus);
 209        int services = 0;
 210
 211        if (dev->is_hotplug_bridge &&
 212            (pcie_ports_native || host->native_pcie_hotplug)) {
 213                services |= PCIE_PORT_SERVICE_HP;
 214
 215                /*
 216                 * Disable hot-plug interrupts in case they have been enabled
 217                 * by the BIOS and the hot-plug service driver is not loaded.
 218                 */
 219                pcie_capability_clear_word(dev, PCI_EXP_SLTCTL,
 220                          PCI_EXP_SLTCTL_CCIE | PCI_EXP_SLTCTL_HPIE);
 221        }
 222
 223#ifdef CONFIG_PCIEAER
 224        if (dev->aer_cap && pci_aer_available() &&
 225            (pcie_ports_native || host->native_aer)) {
 226                services |= PCIE_PORT_SERVICE_AER;
 227
 228                /*
 229                 * Disable AER on this port in case it's been enabled by the
 230                 * BIOS (the AER service driver will enable it when necessary).
 231                 */
 232                pci_disable_pcie_error_reporting(dev);
 233        }
 234#endif
 235
 236        /* Root Ports and Root Complex Event Collectors may generate PMEs */
 237        if ((pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT ||
 238             pci_pcie_type(dev) == PCI_EXP_TYPE_RC_EC) &&
 239            (pcie_ports_native || host->native_pme)) {
 240                services |= PCIE_PORT_SERVICE_PME;
 241
 242                /*
 243                 * Disable PME interrupt on this port in case it's been enabled
 244                 * by the BIOS (the PME service driver will enable it when
 245                 * necessary).
 246                 */
 247                pcie_pme_interrupt_enable(dev, false);
 248        }
 249
 250        /*
 251         * With dpc-native, allow Linux to use DPC even if it doesn't have
 252         * permission to use AER.
 253         */
 254        if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_DPC) &&
 255            pci_aer_available() &&
 256            (pcie_ports_dpc_native || (services & PCIE_PORT_SERVICE_AER)))
 257                services |= PCIE_PORT_SERVICE_DPC;
 258
 259        if (pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM ||
 260            pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
 261                services |= PCIE_PORT_SERVICE_BWNOTIF;
 262
 263        return services;
 264}
 265
 266/**
 267 * pcie_device_init - allocate and initialize PCI Express port service device
 268 * @pdev: PCI Express port to associate the service device with
 269 * @service: Type of service to associate with the service device
 270 * @irq: Interrupt vector to associate with the service device
 271 */
 272static int pcie_device_init(struct pci_dev *pdev, int service, int irq)
 273{
 274        int retval;
 275        struct pcie_device *pcie;
 276        struct device *device;
 277
 278        pcie = kzalloc(sizeof(*pcie), GFP_KERNEL);
 279        if (!pcie)
 280                return -ENOMEM;
 281        pcie->port = pdev;
 282        pcie->irq = irq;
 283        pcie->service = service;
 284
 285        /* Initialize generic device interface */
 286        device = &pcie->device;
 287        device->bus = &pcie_port_bus_type;
 288        device->release = release_pcie_device;  /* callback to free pcie dev */
 289        dev_set_name(device, "%s:pcie%03x",
 290                     pci_name(pdev),
 291                     get_descriptor_id(pci_pcie_type(pdev), service));
 292        device->parent = &pdev->dev;
 293        device_enable_async_suspend(device);
 294
 295        retval = device_register(device);
 296        if (retval) {
 297                put_device(device);
 298                return retval;
 299        }
 300
 301        pm_runtime_no_callbacks(device);
 302
 303        return 0;
 304}
 305
 306/**
 307 * pcie_port_device_register - register PCI Express port
 308 * @dev: PCI Express port to register
 309 *
 310 * Allocate the port extension structure and register services associated with
 311 * the port.
 312 */
 313int pcie_port_device_register(struct pci_dev *dev)
 314{
 315        int status, capabilities, i, nr_service;
 316        int irqs[PCIE_PORT_DEVICE_MAXSERVICES];
 317
 318        /* Enable PCI Express port device */
 319        status = pci_enable_device(dev);
 320        if (status)
 321                return status;
 322
 323        /* Get and check PCI Express port services */
 324        capabilities = get_port_device_capability(dev);
 325        if (!capabilities)
 326                return 0;
 327
 328        pci_set_master(dev);
 329        /*
 330         * Initialize service irqs. Don't use service devices that
 331         * require interrupts if there is no way to generate them.
 332         * However, some drivers may have a polling mode (e.g. pciehp_poll_mode)
 333         * that can be used in the absence of irqs.  Allow them to determine
 334         * if that is to be used.
 335         */
 336        status = pcie_init_service_irqs(dev, irqs, capabilities);
 337        if (status) {
 338                capabilities &= PCIE_PORT_SERVICE_HP;
 339                if (!capabilities)
 340                        goto error_disable;
 341        }
 342
 343        /* Allocate child services if any */
 344        status = -ENODEV;
 345        nr_service = 0;
 346        for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
 347                int service = 1 << i;
 348                if (!(capabilities & service))
 349                        continue;
 350                if (!pcie_device_init(dev, service, irqs[i]))
 351                        nr_service++;
 352        }
 353        if (!nr_service)
 354                goto error_cleanup_irqs;
 355
 356        return 0;
 357
 358error_cleanup_irqs:
 359        pci_free_irq_vectors(dev);
 360error_disable:
 361        pci_disable_device(dev);
 362        return status;
 363}
 364
 365#ifdef CONFIG_PM
 366typedef int (*pcie_pm_callback_t)(struct pcie_device *);
 367
 368static int pm_iter(struct device *dev, void *data)
 369{
 370        struct pcie_port_service_driver *service_driver;
 371        size_t offset = *(size_t *)data;
 372        pcie_pm_callback_t cb;
 373
 374        if ((dev->bus == &pcie_port_bus_type) && dev->driver) {
 375                service_driver = to_service_driver(dev->driver);
 376                cb = *(pcie_pm_callback_t *)((void *)service_driver + offset);
 377                if (cb)
 378                        return cb(to_pcie_device(dev));
 379        }
 380        return 0;
 381}
 382
 383/**
 384 * pcie_port_device_suspend - suspend port services associated with a PCIe port
 385 * @dev: PCI Express port to handle
 386 */
 387int pcie_port_device_suspend(struct device *dev)
 388{
 389        size_t off = offsetof(struct pcie_port_service_driver, suspend);
 390        return device_for_each_child(dev, &off, pm_iter);
 391}
 392
 393int pcie_port_device_resume_noirq(struct device *dev)
 394{
 395        size_t off = offsetof(struct pcie_port_service_driver, resume_noirq);
 396        return device_for_each_child(dev, &off, pm_iter);
 397}
 398
 399/**
 400 * pcie_port_device_resume - resume port services associated with a PCIe port
 401 * @dev: PCI Express port to handle
 402 */
 403int pcie_port_device_resume(struct device *dev)
 404{
 405        size_t off = offsetof(struct pcie_port_service_driver, resume);
 406        return device_for_each_child(dev, &off, pm_iter);
 407}
 408
 409/**
 410 * pcie_port_device_runtime_suspend - runtime suspend port services
 411 * @dev: PCI Express port to handle
 412 */
 413int pcie_port_device_runtime_suspend(struct device *dev)
 414{
 415        size_t off = offsetof(struct pcie_port_service_driver, runtime_suspend);
 416        return device_for_each_child(dev, &off, pm_iter);
 417}
 418
 419/**
 420 * pcie_port_device_runtime_resume - runtime resume port services
 421 * @dev: PCI Express port to handle
 422 */
 423int pcie_port_device_runtime_resume(struct device *dev)
 424{
 425        size_t off = offsetof(struct pcie_port_service_driver, runtime_resume);
 426        return device_for_each_child(dev, &off, pm_iter);
 427}
 428#endif /* PM */
 429
 430static int remove_iter(struct device *dev, void *data)
 431{
 432        if (dev->bus == &pcie_port_bus_type)
 433                device_unregister(dev);
 434        return 0;
 435}
 436
 437static int find_service_iter(struct device *device, void *data)
 438{
 439        struct pcie_port_service_driver *service_driver;
 440        struct portdrv_service_data *pdrvs;
 441        u32 service;
 442
 443        pdrvs = (struct portdrv_service_data *) data;
 444        service = pdrvs->service;
 445
 446        if (device->bus == &pcie_port_bus_type && device->driver) {
 447                service_driver = to_service_driver(device->driver);
 448                if (service_driver->service == service) {
 449                        pdrvs->drv = service_driver;
 450                        pdrvs->dev = device;
 451                        return 1;
 452                }
 453        }
 454
 455        return 0;
 456}
 457
 458/**
 459 * pcie_port_find_device - find the struct device
 460 * @dev: PCI Express port the service is associated with
 461 * @service: For the service to find
 462 *
 463 * Find the struct device associated with given service on a pci_dev
 464 */
 465struct device *pcie_port_find_device(struct pci_dev *dev,
 466                                      u32 service)
 467{
 468        struct device *device;
 469        struct portdrv_service_data pdrvs;
 470
 471        pdrvs.dev = NULL;
 472        pdrvs.service = service;
 473        device_for_each_child(&dev->dev, &pdrvs, find_service_iter);
 474
 475        device = pdrvs.dev;
 476        return device;
 477}
 478EXPORT_SYMBOL_GPL(pcie_port_find_device);
 479
 480/**
 481 * pcie_port_device_remove - unregister PCI Express port service devices
 482 * @dev: PCI Express port the service devices to unregister are associated with
 483 *
 484 * Remove PCI Express port service devices associated with given port and
 485 * disable MSI-X or MSI for the port.
 486 */
 487void pcie_port_device_remove(struct pci_dev *dev)
 488{
 489        device_for_each_child(&dev->dev, NULL, remove_iter);
 490        pci_free_irq_vectors(dev);
 491        pci_disable_device(dev);
 492}
 493
 494/**
 495 * pcie_port_probe_service - probe driver for given PCI Express port service
 496 * @dev: PCI Express port service device to probe against
 497 *
 498 * If PCI Express port service driver is registered with
 499 * pcie_port_service_register(), this function will be called by the driver core
 500 * whenever match is found between the driver and a port service device.
 501 */
 502static int pcie_port_probe_service(struct device *dev)
 503{
 504        struct pcie_device *pciedev;
 505        struct pcie_port_service_driver *driver;
 506        int status;
 507
 508        if (!dev || !dev->driver)
 509                return -ENODEV;
 510
 511        driver = to_service_driver(dev->driver);
 512        if (!driver || !driver->probe)
 513                return -ENODEV;
 514
 515        pciedev = to_pcie_device(dev);
 516        status = driver->probe(pciedev);
 517        if (status)
 518                return status;
 519
 520        get_device(dev);
 521        return 0;
 522}
 523
 524/**
 525 * pcie_port_remove_service - detach driver from given PCI Express port service
 526 * @dev: PCI Express port service device to handle
 527 *
 528 * If PCI Express port service driver is registered with
 529 * pcie_port_service_register(), this function will be called by the driver core
 530 * when device_unregister() is called for the port service device associated
 531 * with the driver.
 532 */
 533static int pcie_port_remove_service(struct device *dev)
 534{
 535        struct pcie_device *pciedev;
 536        struct pcie_port_service_driver *driver;
 537
 538        if (!dev || !dev->driver)
 539                return 0;
 540
 541        pciedev = to_pcie_device(dev);
 542        driver = to_service_driver(dev->driver);
 543        if (driver && driver->remove) {
 544                driver->remove(pciedev);
 545                put_device(dev);
 546        }
 547        return 0;
 548}
 549
 550/**
 551 * pcie_port_shutdown_service - shut down given PCI Express port service
 552 * @dev: PCI Express port service device to handle
 553 *
 554 * If PCI Express port service driver is registered with
 555 * pcie_port_service_register(), this function will be called by the driver core
 556 * when device_shutdown() is called for the port service device associated
 557 * with the driver.
 558 */
 559static void pcie_port_shutdown_service(struct device *dev) {}
 560
 561/**
 562 * pcie_port_service_register - register PCI Express port service driver
 563 * @new: PCI Express port service driver to register
 564 */
 565int pcie_port_service_register(struct pcie_port_service_driver *new)
 566{
 567        if (pcie_ports_disabled)
 568                return -ENODEV;
 569
 570        new->driver.name = new->name;
 571        new->driver.bus = &pcie_port_bus_type;
 572        new->driver.probe = pcie_port_probe_service;
 573        new->driver.remove = pcie_port_remove_service;
 574        new->driver.shutdown = pcie_port_shutdown_service;
 575
 576        return driver_register(&new->driver);
 577}
 578EXPORT_SYMBOL(pcie_port_service_register);
 579
 580/**
 581 * pcie_port_service_unregister - unregister PCI Express port service driver
 582 * @drv: PCI Express port service driver to unregister
 583 */
 584void pcie_port_service_unregister(struct pcie_port_service_driver *drv)
 585{
 586        driver_unregister(&drv->driver);
 587}
 588EXPORT_SYMBOL(pcie_port_service_unregister);
 589