linux/drivers/pci/iov.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * PCI Express I/O Virtualization (IOV) support
   4 *   Single Root IOV 1.0
   5 *   Address Translation Service 1.0
   6 *
   7 * Copyright (C) 2009 Intel Corporation, Yu Zhao <yu.zhao@intel.com>
   8 */
   9
  10#include <linux/pci.h>
  11#include <linux/slab.h>
  12#include <linux/mutex.h>
  13#include <linux/export.h>
  14#include <linux/string.h>
  15#include <linux/delay.h>
  16#include <linux/pci-ats.h>
  17#include "pci.h"
  18
  19#define VIRTFN_ID_LEN   16
  20
  21int pci_iov_virtfn_bus(struct pci_dev *dev, int vf_id)
  22{
  23        if (!dev->is_physfn)
  24                return -EINVAL;
  25        return dev->bus->number + ((dev->devfn + dev->sriov->offset +
  26                                    dev->sriov->stride * vf_id) >> 8);
  27}
  28
  29int pci_iov_virtfn_devfn(struct pci_dev *dev, int vf_id)
  30{
  31        if (!dev->is_physfn)
  32                return -EINVAL;
  33        return (dev->devfn + dev->sriov->offset +
  34                dev->sriov->stride * vf_id) & 0xff;
  35}
  36
  37/*
  38 * Per SR-IOV spec sec 3.3.10 and 3.3.11, First VF Offset and VF Stride may
  39 * change when NumVFs changes.
  40 *
  41 * Update iov->offset and iov->stride when NumVFs is written.
  42 */
  43static inline void pci_iov_set_numvfs(struct pci_dev *dev, int nr_virtfn)
  44{
  45        struct pci_sriov *iov = dev->sriov;
  46
  47        pci_write_config_word(dev, iov->pos + PCI_SRIOV_NUM_VF, nr_virtfn);
  48        pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_OFFSET, &iov->offset);
  49        pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_STRIDE, &iov->stride);
  50}
  51
  52/*
  53 * The PF consumes one bus number.  NumVFs, First VF Offset, and VF Stride
  54 * determine how many additional bus numbers will be consumed by VFs.
  55 *
  56 * Iterate over all valid NumVFs, validate offset and stride, and calculate
  57 * the maximum number of bus numbers that could ever be required.
  58 */
  59static int compute_max_vf_buses(struct pci_dev *dev)
  60{
  61        struct pci_sriov *iov = dev->sriov;
  62        int nr_virtfn, busnr, rc = 0;
  63
  64        for (nr_virtfn = iov->total_VFs; nr_virtfn; nr_virtfn--) {
  65                pci_iov_set_numvfs(dev, nr_virtfn);
  66                if (!iov->offset || (nr_virtfn > 1 && !iov->stride)) {
  67                        rc = -EIO;
  68                        goto out;
  69                }
  70
  71                busnr = pci_iov_virtfn_bus(dev, nr_virtfn - 1);
  72                if (busnr > iov->max_VF_buses)
  73                        iov->max_VF_buses = busnr;
  74        }
  75
  76out:
  77        pci_iov_set_numvfs(dev, 0);
  78        return rc;
  79}
  80
  81static struct pci_bus *virtfn_add_bus(struct pci_bus *bus, int busnr)
  82{
  83        struct pci_bus *child;
  84
  85        if (bus->number == busnr)
  86                return bus;
  87
  88        child = pci_find_bus(pci_domain_nr(bus), busnr);
  89        if (child)
  90                return child;
  91
  92        child = pci_add_new_bus(bus, NULL, busnr);
  93        if (!child)
  94                return NULL;
  95
  96        pci_bus_insert_busn_res(child, busnr, busnr);
  97
  98        return child;
  99}
 100
 101static void virtfn_remove_bus(struct pci_bus *physbus, struct pci_bus *virtbus)
 102{
 103        if (physbus != virtbus && list_empty(&virtbus->devices))
 104                pci_remove_bus(virtbus);
 105}
 106
 107resource_size_t pci_iov_resource_size(struct pci_dev *dev, int resno)
 108{
 109        if (!dev->is_physfn)
 110                return 0;
 111
 112        return dev->sriov->barsz[resno - PCI_IOV_RESOURCES];
 113}
 114
 115static void pci_read_vf_config_common(struct pci_dev *virtfn)
 116{
 117        struct pci_dev *physfn = virtfn->physfn;
 118
 119        /*
 120         * Some config registers are the same across all associated VFs.
 121         * Read them once from VF0 so we can skip reading them from the
 122         * other VFs.
 123         *
 124         * PCIe r4.0, sec 9.3.4.1, technically doesn't require all VFs to
 125         * have the same Revision ID and Subsystem ID, but we assume they
 126         * do.
 127         */
 128        pci_read_config_dword(virtfn, PCI_CLASS_REVISION,
 129                              &physfn->sriov->class);
 130        pci_read_config_byte(virtfn, PCI_HEADER_TYPE,
 131                             &physfn->sriov->hdr_type);
 132        pci_read_config_word(virtfn, PCI_SUBSYSTEM_VENDOR_ID,
 133                             &physfn->sriov->subsystem_vendor);
 134        pci_read_config_word(virtfn, PCI_SUBSYSTEM_ID,
 135                             &physfn->sriov->subsystem_device);
 136}
 137
 138int pci_iov_add_virtfn(struct pci_dev *dev, int id)
 139{
 140        int i;
 141        int rc = -ENOMEM;
 142        u64 size;
 143        char buf[VIRTFN_ID_LEN];
 144        struct pci_dev *virtfn;
 145        struct resource *res;
 146        struct pci_sriov *iov = dev->sriov;
 147        struct pci_bus *bus;
 148
 149        bus = virtfn_add_bus(dev->bus, pci_iov_virtfn_bus(dev, id));
 150        if (!bus)
 151                goto failed;
 152
 153        virtfn = pci_alloc_dev(bus);
 154        if (!virtfn)
 155                goto failed0;
 156
 157        virtfn->devfn = pci_iov_virtfn_devfn(dev, id);
 158        virtfn->vendor = dev->vendor;
 159        virtfn->device = iov->vf_device;
 160        virtfn->is_virtfn = 1;
 161        virtfn->physfn = pci_dev_get(dev);
 162
 163        if (id == 0)
 164                pci_read_vf_config_common(virtfn);
 165
 166        rc = pci_setup_device(virtfn);
 167        if (rc)
 168                goto failed1;
 169
 170        virtfn->dev.parent = dev->dev.parent;
 171        virtfn->multifunction = 0;
 172
 173        for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
 174                res = &dev->resource[i + PCI_IOV_RESOURCES];
 175                if (!res->parent)
 176                        continue;
 177                virtfn->resource[i].name = pci_name(virtfn);
 178                virtfn->resource[i].flags = res->flags;
 179                size = pci_iov_resource_size(dev, i + PCI_IOV_RESOURCES);
 180                virtfn->resource[i].start = res->start + size * id;
 181                virtfn->resource[i].end = virtfn->resource[i].start + size - 1;
 182                rc = request_resource(res, &virtfn->resource[i]);
 183                BUG_ON(rc);
 184        }
 185
 186        pci_device_add(virtfn, virtfn->bus);
 187
 188        sprintf(buf, "virtfn%u", id);
 189        rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf);
 190        if (rc)
 191                goto failed2;
 192        rc = sysfs_create_link(&virtfn->dev.kobj, &dev->dev.kobj, "physfn");
 193        if (rc)
 194                goto failed3;
 195
 196        kobject_uevent(&virtfn->dev.kobj, KOBJ_CHANGE);
 197
 198        pci_bus_add_device(virtfn);
 199
 200        return 0;
 201
 202failed3:
 203        sysfs_remove_link(&dev->dev.kobj, buf);
 204failed2:
 205        pci_stop_and_remove_bus_device(virtfn);
 206failed1:
 207        pci_dev_put(dev);
 208failed0:
 209        virtfn_remove_bus(dev->bus, bus);
 210failed:
 211
 212        return rc;
 213}
 214
 215void pci_iov_remove_virtfn(struct pci_dev *dev, int id)
 216{
 217        char buf[VIRTFN_ID_LEN];
 218        struct pci_dev *virtfn;
 219
 220        virtfn = pci_get_domain_bus_and_slot(pci_domain_nr(dev->bus),
 221                                             pci_iov_virtfn_bus(dev, id),
 222                                             pci_iov_virtfn_devfn(dev, id));
 223        if (!virtfn)
 224                return;
 225
 226        sprintf(buf, "virtfn%u", id);
 227        sysfs_remove_link(&dev->dev.kobj, buf);
 228        /*
 229         * pci_stop_dev() could have been called for this virtfn already,
 230         * so the directory for the virtfn may have been removed before.
 231         * Double check to avoid spurious sysfs warnings.
 232         */
 233        if (virtfn->dev.kobj.sd)
 234                sysfs_remove_link(&virtfn->dev.kobj, "physfn");
 235
 236        pci_stop_and_remove_bus_device(virtfn);
 237        virtfn_remove_bus(dev->bus, virtfn->bus);
 238
 239        /* balance pci_get_domain_bus_and_slot() */
 240        pci_dev_put(virtfn);
 241        pci_dev_put(dev);
 242}
 243
 244int __weak pcibios_sriov_enable(struct pci_dev *pdev, u16 num_vfs)
 245{
 246        return 0;
 247}
 248
 249int __weak pcibios_sriov_disable(struct pci_dev *pdev)
 250{
 251        return 0;
 252}
 253
 254static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
 255{
 256        int rc;
 257        int i;
 258        int nres;
 259        u16 initial;
 260        struct resource *res;
 261        struct pci_dev *pdev;
 262        struct pci_sriov *iov = dev->sriov;
 263        int bars = 0;
 264        int bus;
 265
 266        if (!nr_virtfn)
 267                return 0;
 268
 269        if (iov->num_VFs)
 270                return -EINVAL;
 271
 272        pci_read_config_word(dev, iov->pos + PCI_SRIOV_INITIAL_VF, &initial);
 273        if (initial > iov->total_VFs ||
 274            (!(iov->cap & PCI_SRIOV_CAP_VFM) && (initial != iov->total_VFs)))
 275                return -EIO;
 276
 277        if (nr_virtfn < 0 || nr_virtfn > iov->total_VFs ||
 278            (!(iov->cap & PCI_SRIOV_CAP_VFM) && (nr_virtfn > initial)))
 279                return -EINVAL;
 280
 281        nres = 0;
 282        for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
 283                bars |= (1 << (i + PCI_IOV_RESOURCES));
 284                res = &dev->resource[i + PCI_IOV_RESOURCES];
 285                if (res->parent)
 286                        nres++;
 287        }
 288        if (nres != iov->nres) {
 289                pci_err(dev, "not enough MMIO resources for SR-IOV\n");
 290                return -ENOMEM;
 291        }
 292
 293        bus = pci_iov_virtfn_bus(dev, nr_virtfn - 1);
 294        if (bus > dev->bus->busn_res.end) {
 295                pci_err(dev, "can't enable %d VFs (bus %02x out of range of %pR)\n",
 296                        nr_virtfn, bus, &dev->bus->busn_res);
 297                return -ENOMEM;
 298        }
 299
 300        if (pci_enable_resources(dev, bars)) {
 301                pci_err(dev, "SR-IOV: IOV BARS not allocated\n");
 302                return -ENOMEM;
 303        }
 304
 305        if (iov->link != dev->devfn) {
 306                pdev = pci_get_slot(dev->bus, iov->link);
 307                if (!pdev)
 308                        return -ENODEV;
 309
 310                if (!pdev->is_physfn) {
 311                        pci_dev_put(pdev);
 312                        return -ENOSYS;
 313                }
 314
 315                rc = sysfs_create_link(&dev->dev.kobj,
 316                                        &pdev->dev.kobj, "dep_link");
 317                pci_dev_put(pdev);
 318                if (rc)
 319                        return rc;
 320        }
 321
 322        iov->initial_VFs = initial;
 323        if (nr_virtfn < initial)
 324                initial = nr_virtfn;
 325
 326        rc = pcibios_sriov_enable(dev, initial);
 327        if (rc) {
 328                pci_err(dev, "failure %d from pcibios_sriov_enable()\n", rc);
 329                goto err_pcibios;
 330        }
 331
 332        pci_iov_set_numvfs(dev, nr_virtfn);
 333        iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE;
 334        pci_cfg_access_lock(dev);
 335        pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
 336        msleep(100);
 337        pci_cfg_access_unlock(dev);
 338
 339        for (i = 0; i < initial; i++) {
 340                rc = pci_iov_add_virtfn(dev, i);
 341                if (rc)
 342                        goto failed;
 343        }
 344
 345        kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE);
 346        iov->num_VFs = nr_virtfn;
 347
 348        return 0;
 349
 350failed:
 351        while (i--)
 352                pci_iov_remove_virtfn(dev, i);
 353
 354err_pcibios:
 355        iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE);
 356        pci_cfg_access_lock(dev);
 357        pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
 358        ssleep(1);
 359        pci_cfg_access_unlock(dev);
 360
 361        pcibios_sriov_disable(dev);
 362
 363        if (iov->link != dev->devfn)
 364                sysfs_remove_link(&dev->dev.kobj, "dep_link");
 365
 366        pci_iov_set_numvfs(dev, 0);
 367        return rc;
 368}
 369
 370static void sriov_disable(struct pci_dev *dev)
 371{
 372        int i;
 373        struct pci_sriov *iov = dev->sriov;
 374
 375        if (!iov->num_VFs)
 376                return;
 377
 378        for (i = 0; i < iov->num_VFs; i++)
 379                pci_iov_remove_virtfn(dev, i);
 380
 381        iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE);
 382        pci_cfg_access_lock(dev);
 383        pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
 384        ssleep(1);
 385        pci_cfg_access_unlock(dev);
 386
 387        pcibios_sriov_disable(dev);
 388
 389        if (iov->link != dev->devfn)
 390                sysfs_remove_link(&dev->dev.kobj, "dep_link");
 391
 392        iov->num_VFs = 0;
 393        pci_iov_set_numvfs(dev, 0);
 394}
 395
 396static int sriov_init(struct pci_dev *dev, int pos)
 397{
 398        int i, bar64;
 399        int rc;
 400        int nres;
 401        u32 pgsz;
 402        u16 ctrl, total;
 403        struct pci_sriov *iov;
 404        struct resource *res;
 405        struct pci_dev *pdev;
 406
 407        pci_read_config_word(dev, pos + PCI_SRIOV_CTRL, &ctrl);
 408        if (ctrl & PCI_SRIOV_CTRL_VFE) {
 409                pci_write_config_word(dev, pos + PCI_SRIOV_CTRL, 0);
 410                ssleep(1);
 411        }
 412
 413        ctrl = 0;
 414        list_for_each_entry(pdev, &dev->bus->devices, bus_list)
 415                if (pdev->is_physfn)
 416                        goto found;
 417
 418        pdev = NULL;
 419        if (pci_ari_enabled(dev->bus))
 420                ctrl |= PCI_SRIOV_CTRL_ARI;
 421
 422found:
 423        pci_write_config_word(dev, pos + PCI_SRIOV_CTRL, ctrl);
 424
 425        pci_read_config_word(dev, pos + PCI_SRIOV_TOTAL_VF, &total);
 426        if (!total)
 427                return 0;
 428
 429        pci_read_config_dword(dev, pos + PCI_SRIOV_SUP_PGSIZE, &pgsz);
 430        i = PAGE_SHIFT > 12 ? PAGE_SHIFT - 12 : 0;
 431        pgsz &= ~((1 << i) - 1);
 432        if (!pgsz)
 433                return -EIO;
 434
 435        pgsz &= ~(pgsz - 1);
 436        pci_write_config_dword(dev, pos + PCI_SRIOV_SYS_PGSIZE, pgsz);
 437
 438        iov = kzalloc(sizeof(*iov), GFP_KERNEL);
 439        if (!iov)
 440                return -ENOMEM;
 441
 442        nres = 0;
 443        for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
 444                res = &dev->resource[i + PCI_IOV_RESOURCES];
 445                /*
 446                 * If it is already FIXED, don't change it, something
 447                 * (perhaps EA or header fixups) wants it this way.
 448                 */
 449                if (res->flags & IORESOURCE_PCI_FIXED)
 450                        bar64 = (res->flags & IORESOURCE_MEM_64) ? 1 : 0;
 451                else
 452                        bar64 = __pci_read_base(dev, pci_bar_unknown, res,
 453                                                pos + PCI_SRIOV_BAR + i * 4);
 454                if (!res->flags)
 455                        continue;
 456                if (resource_size(res) & (PAGE_SIZE - 1)) {
 457                        rc = -EIO;
 458                        goto failed;
 459                }
 460                iov->barsz[i] = resource_size(res);
 461                res->end = res->start + resource_size(res) * total - 1;
 462                pci_info(dev, "VF(n) BAR%d space: %pR (contains BAR%d for %d VFs)\n",
 463                         i, res, i, total);
 464                i += bar64;
 465                nres++;
 466        }
 467
 468        iov->pos = pos;
 469        iov->nres = nres;
 470        iov->ctrl = ctrl;
 471        iov->total_VFs = total;
 472        pci_read_config_word(dev, pos + PCI_SRIOV_VF_DID, &iov->vf_device);
 473        iov->pgsz = pgsz;
 474        iov->self = dev;
 475        iov->drivers_autoprobe = true;
 476        pci_read_config_dword(dev, pos + PCI_SRIOV_CAP, &iov->cap);
 477        pci_read_config_byte(dev, pos + PCI_SRIOV_FUNC_LINK, &iov->link);
 478        if (pci_pcie_type(dev) == PCI_EXP_TYPE_RC_END)
 479                iov->link = PCI_DEVFN(PCI_SLOT(dev->devfn), iov->link);
 480
 481        if (pdev)
 482                iov->dev = pci_dev_get(pdev);
 483        else
 484                iov->dev = dev;
 485
 486        dev->sriov = iov;
 487        dev->is_physfn = 1;
 488        rc = compute_max_vf_buses(dev);
 489        if (rc)
 490                goto fail_max_buses;
 491
 492        return 0;
 493
 494fail_max_buses:
 495        dev->sriov = NULL;
 496        dev->is_physfn = 0;
 497failed:
 498        for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
 499                res = &dev->resource[i + PCI_IOV_RESOURCES];
 500                res->flags = 0;
 501        }
 502
 503        kfree(iov);
 504        return rc;
 505}
 506
 507static void sriov_release(struct pci_dev *dev)
 508{
 509        BUG_ON(dev->sriov->num_VFs);
 510
 511        if (dev != dev->sriov->dev)
 512                pci_dev_put(dev->sriov->dev);
 513
 514        kfree(dev->sriov);
 515        dev->sriov = NULL;
 516}
 517
 518static void sriov_restore_state(struct pci_dev *dev)
 519{
 520        int i;
 521        u16 ctrl;
 522        struct pci_sriov *iov = dev->sriov;
 523
 524        pci_read_config_word(dev, iov->pos + PCI_SRIOV_CTRL, &ctrl);
 525        if (ctrl & PCI_SRIOV_CTRL_VFE)
 526                return;
 527
 528        /*
 529         * Restore PCI_SRIOV_CTRL_ARI before pci_iov_set_numvfs() because
 530         * it reads offset & stride, which depend on PCI_SRIOV_CTRL_ARI.
 531         */
 532        ctrl &= ~PCI_SRIOV_CTRL_ARI;
 533        ctrl |= iov->ctrl & PCI_SRIOV_CTRL_ARI;
 534        pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, ctrl);
 535
 536        for (i = PCI_IOV_RESOURCES; i <= PCI_IOV_RESOURCE_END; i++)
 537                pci_update_resource(dev, i);
 538
 539        pci_write_config_dword(dev, iov->pos + PCI_SRIOV_SYS_PGSIZE, iov->pgsz);
 540        pci_iov_set_numvfs(dev, iov->num_VFs);
 541        pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
 542        if (iov->ctrl & PCI_SRIOV_CTRL_VFE)
 543                msleep(100);
 544}
 545
 546/**
 547 * pci_iov_init - initialize the IOV capability
 548 * @dev: the PCI device
 549 *
 550 * Returns 0 on success, or negative on failure.
 551 */
 552int pci_iov_init(struct pci_dev *dev)
 553{
 554        int pos;
 555
 556        if (!pci_is_pcie(dev))
 557                return -ENODEV;
 558
 559        pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_SRIOV);
 560        if (pos)
 561                return sriov_init(dev, pos);
 562
 563        return -ENODEV;
 564}
 565
 566/**
 567 * pci_iov_release - release resources used by the IOV capability
 568 * @dev: the PCI device
 569 */
 570void pci_iov_release(struct pci_dev *dev)
 571{
 572        if (dev->is_physfn)
 573                sriov_release(dev);
 574}
 575
 576/**
 577 * pci_iov_update_resource - update a VF BAR
 578 * @dev: the PCI device
 579 * @resno: the resource number
 580 *
 581 * Update a VF BAR in the SR-IOV capability of a PF.
 582 */
 583void pci_iov_update_resource(struct pci_dev *dev, int resno)
 584{
 585        struct pci_sriov *iov = dev->is_physfn ? dev->sriov : NULL;
 586        struct resource *res = dev->resource + resno;
 587        int vf_bar = resno - PCI_IOV_RESOURCES;
 588        struct pci_bus_region region;
 589        u16 cmd;
 590        u32 new;
 591        int reg;
 592
 593        /*
 594         * The generic pci_restore_bars() path calls this for all devices,
 595         * including VFs and non-SR-IOV devices.  If this is not a PF, we
 596         * have nothing to do.
 597         */
 598        if (!iov)
 599                return;
 600
 601        pci_read_config_word(dev, iov->pos + PCI_SRIOV_CTRL, &cmd);
 602        if ((cmd & PCI_SRIOV_CTRL_VFE) && (cmd & PCI_SRIOV_CTRL_MSE)) {
 603                dev_WARN(&dev->dev, "can't update enabled VF BAR%d %pR\n",
 604                         vf_bar, res);
 605                return;
 606        }
 607
 608        /*
 609         * Ignore unimplemented BARs, unused resource slots for 64-bit
 610         * BARs, and non-movable resources, e.g., those described via
 611         * Enhanced Allocation.
 612         */
 613        if (!res->flags)
 614                return;
 615
 616        if (res->flags & IORESOURCE_UNSET)
 617                return;
 618
 619        if (res->flags & IORESOURCE_PCI_FIXED)
 620                return;
 621
 622        pcibios_resource_to_bus(dev->bus, &region, res);
 623        new = region.start;
 624        new |= res->flags & ~PCI_BASE_ADDRESS_MEM_MASK;
 625
 626        reg = iov->pos + PCI_SRIOV_BAR + 4 * vf_bar;
 627        pci_write_config_dword(dev, reg, new);
 628        if (res->flags & IORESOURCE_MEM_64) {
 629                new = region.start >> 16 >> 16;
 630                pci_write_config_dword(dev, reg + 4, new);
 631        }
 632}
 633
 634resource_size_t __weak pcibios_iov_resource_alignment(struct pci_dev *dev,
 635                                                      int resno)
 636{
 637        return pci_iov_resource_size(dev, resno);
 638}
 639
 640/**
 641 * pci_sriov_resource_alignment - get resource alignment for VF BAR
 642 * @dev: the PCI device
 643 * @resno: the resource number
 644 *
 645 * Returns the alignment of the VF BAR found in the SR-IOV capability.
 646 * This is not the same as the resource size which is defined as
 647 * the VF BAR size multiplied by the number of VFs.  The alignment
 648 * is just the VF BAR size.
 649 */
 650resource_size_t pci_sriov_resource_alignment(struct pci_dev *dev, int resno)
 651{
 652        return pcibios_iov_resource_alignment(dev, resno);
 653}
 654
 655/**
 656 * pci_restore_iov_state - restore the state of the IOV capability
 657 * @dev: the PCI device
 658 */
 659void pci_restore_iov_state(struct pci_dev *dev)
 660{
 661        if (dev->is_physfn)
 662                sriov_restore_state(dev);
 663}
 664
 665/**
 666 * pci_vf_drivers_autoprobe - set PF property drivers_autoprobe for VFs
 667 * @dev: the PCI device
 668 * @auto_probe: set VF drivers auto probe flag
 669 */
 670void pci_vf_drivers_autoprobe(struct pci_dev *dev, bool auto_probe)
 671{
 672        if (dev->is_physfn)
 673                dev->sriov->drivers_autoprobe = auto_probe;
 674}
 675
 676/**
 677 * pci_iov_bus_range - find bus range used by Virtual Function
 678 * @bus: the PCI bus
 679 *
 680 * Returns max number of buses (exclude current one) used by Virtual
 681 * Functions.
 682 */
 683int pci_iov_bus_range(struct pci_bus *bus)
 684{
 685        int max = 0;
 686        struct pci_dev *dev;
 687
 688        list_for_each_entry(dev, &bus->devices, bus_list) {
 689                if (!dev->is_physfn)
 690                        continue;
 691                if (dev->sriov->max_VF_buses > max)
 692                        max = dev->sriov->max_VF_buses;
 693        }
 694
 695        return max ? max - bus->number : 0;
 696}
 697
 698/**
 699 * pci_enable_sriov - enable the SR-IOV capability
 700 * @dev: the PCI device
 701 * @nr_virtfn: number of virtual functions to enable
 702 *
 703 * Returns 0 on success, or negative on failure.
 704 */
 705int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn)
 706{
 707        might_sleep();
 708
 709        if (!dev->is_physfn)
 710                return -ENOSYS;
 711
 712        return sriov_enable(dev, nr_virtfn);
 713}
 714EXPORT_SYMBOL_GPL(pci_enable_sriov);
 715
 716/**
 717 * pci_disable_sriov - disable the SR-IOV capability
 718 * @dev: the PCI device
 719 */
 720void pci_disable_sriov(struct pci_dev *dev)
 721{
 722        might_sleep();
 723
 724        if (!dev->is_physfn)
 725                return;
 726
 727        sriov_disable(dev);
 728}
 729EXPORT_SYMBOL_GPL(pci_disable_sriov);
 730
 731/**
 732 * pci_num_vf - return number of VFs associated with a PF device_release_driver
 733 * @dev: the PCI device
 734 *
 735 * Returns number of VFs, or 0 if SR-IOV is not enabled.
 736 */
 737int pci_num_vf(struct pci_dev *dev)
 738{
 739        if (!dev->is_physfn)
 740                return 0;
 741
 742        return dev->sriov->num_VFs;
 743}
 744EXPORT_SYMBOL_GPL(pci_num_vf);
 745
 746/**
 747 * pci_vfs_assigned - returns number of VFs are assigned to a guest
 748 * @dev: the PCI device
 749 *
 750 * Returns number of VFs belonging to this device that are assigned to a guest.
 751 * If device is not a physical function returns 0.
 752 */
 753int pci_vfs_assigned(struct pci_dev *dev)
 754{
 755        struct pci_dev *vfdev;
 756        unsigned int vfs_assigned = 0;
 757        unsigned short dev_id;
 758
 759        /* only search if we are a PF */
 760        if (!dev->is_physfn)
 761                return 0;
 762
 763        /*
 764         * determine the device ID for the VFs, the vendor ID will be the
 765         * same as the PF so there is no need to check for that one
 766         */
 767        dev_id = dev->sriov->vf_device;
 768
 769        /* loop through all the VFs to see if we own any that are assigned */
 770        vfdev = pci_get_device(dev->vendor, dev_id, NULL);
 771        while (vfdev) {
 772                /*
 773                 * It is considered assigned if it is a virtual function with
 774                 * our dev as the physical function and the assigned bit is set
 775                 */
 776                if (vfdev->is_virtfn && (vfdev->physfn == dev) &&
 777                        pci_is_dev_assigned(vfdev))
 778                        vfs_assigned++;
 779
 780                vfdev = pci_get_device(dev->vendor, dev_id, vfdev);
 781        }
 782
 783        return vfs_assigned;
 784}
 785EXPORT_SYMBOL_GPL(pci_vfs_assigned);
 786
 787/**
 788 * pci_sriov_set_totalvfs -- reduce the TotalVFs available
 789 * @dev: the PCI PF device
 790 * @numvfs: number that should be used for TotalVFs supported
 791 *
 792 * Should be called from PF driver's probe routine with
 793 * device's mutex held.
 794 *
 795 * Returns 0 if PF is an SRIOV-capable device and
 796 * value of numvfs valid. If not a PF return -ENOSYS;
 797 * if numvfs is invalid return -EINVAL;
 798 * if VFs already enabled, return -EBUSY.
 799 */
 800int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs)
 801{
 802        if (!dev->is_physfn)
 803                return -ENOSYS;
 804        if (numvfs > dev->sriov->total_VFs)
 805                return -EINVAL;
 806
 807        /* Shouldn't change if VFs already enabled */
 808        if (dev->sriov->ctrl & PCI_SRIOV_CTRL_VFE)
 809                return -EBUSY;
 810        else
 811                dev->sriov->driver_max_VFs = numvfs;
 812
 813        return 0;
 814}
 815EXPORT_SYMBOL_GPL(pci_sriov_set_totalvfs);
 816
 817/**
 818 * pci_sriov_get_totalvfs -- get total VFs supported on this device
 819 * @dev: the PCI PF device
 820 *
 821 * For a PCIe device with SRIOV support, return the PCIe
 822 * SRIOV capability value of TotalVFs or the value of driver_max_VFs
 823 * if the driver reduced it.  Otherwise 0.
 824 */
 825int pci_sriov_get_totalvfs(struct pci_dev *dev)
 826{
 827        if (!dev->is_physfn)
 828                return 0;
 829
 830        if (dev->sriov->driver_max_VFs)
 831                return dev->sriov->driver_max_VFs;
 832
 833        return dev->sriov->total_VFs;
 834}
 835EXPORT_SYMBOL_GPL(pci_sriov_get_totalvfs);
 836