linux/Documentation/PCI/pci-iov-howto.rst
<<
>>
Prefs
   1.. SPDX-License-Identifier: GPL-2.0
   2.. include:: <isonum.txt>
   3
   4====================================
   5PCI Express I/O Virtualization Howto
   6====================================
   7
   8:Copyright: |copy| 2009 Intel Corporation
   9:Authors: - Yu Zhao <yu.zhao@intel.com>
  10          - Donald Dutile <ddutile@redhat.com>
  11
  12Overview
  13========
  14
  15What is SR-IOV
  16--------------
  17
  18Single Root I/O Virtualization (SR-IOV) is a PCI Express Extended
  19capability which makes one physical device appear as multiple virtual
  20devices. The physical device is referred to as Physical Function (PF)
  21while the virtual devices are referred to as Virtual Functions (VF).
  22Allocation of the VF can be dynamically controlled by the PF via
  23registers encapsulated in the capability. By default, this feature is
  24not enabled and the PF behaves as traditional PCIe device. Once it's
  25turned on, each VF's PCI configuration space can be accessed by its own
  26Bus, Device and Function Number (Routing ID). And each VF also has PCI
  27Memory Space, which is used to map its register set. VF device driver
  28operates on the register set so it can be functional and appear as a
  29real existing PCI device.
  30
  31User Guide
  32==========
  33
  34How can I enable SR-IOV capability
  35----------------------------------
  36
  37Multiple methods are available for SR-IOV enablement.
  38In the first method, the device driver (PF driver) will control the
  39enabling and disabling of the capability via API provided by SR-IOV core.
  40If the hardware has SR-IOV capability, loading its PF driver would
  41enable it and all VFs associated with the PF.  Some PF drivers require
  42a module parameter to be set to determine the number of VFs to enable.
  43In the second method, a write to the sysfs file sriov_numvfs will
  44enable and disable the VFs associated with a PCIe PF.  This method
  45enables per-PF, VF enable/disable values versus the first method,
  46which applies to all PFs of the same device.  Additionally, the
  47PCI SRIOV core support ensures that enable/disable operations are
  48valid to reduce duplication in multiple drivers for the same
  49checks, e.g., check numvfs == 0 if enabling VFs, ensure
  50numvfs <= totalvfs.
  51The second method is the recommended method for new/future VF devices.
  52
  53How can I use the Virtual Functions
  54-----------------------------------
  55
  56The VF is treated as hot-plugged PCI devices in the kernel, so they
  57should be able to work in the same way as real PCI devices. The VF
  58requires device driver that is same as a normal PCI device's.
  59
  60Developer Guide
  61===============
  62
  63SR-IOV API
  64----------
  65
  66To enable SR-IOV capability:
  67
  68(a) For the first method, in the driver::
  69
  70        int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);
  71
  72'nr_virtfn' is number of VFs to be enabled.
  73
  74(b) For the second method, from sysfs::
  75
  76        echo 'nr_virtfn' > \
  77        /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_numvfs
  78
  79To disable SR-IOV capability:
  80
  81(a) For the first method, in the driver::
  82
  83        void pci_disable_sriov(struct pci_dev *dev);
  84
  85(b) For the second method, from sysfs::
  86
  87        echo  0 > \
  88        /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_numvfs
  89
  90To enable auto probing VFs by a compatible driver on the host, run
  91command below before enabling SR-IOV capabilities. This is the
  92default behavior.
  93::
  94
  95        echo 1 > \
  96        /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_drivers_autoprobe
  97
  98To disable auto probing VFs by a compatible driver on the host, run
  99command below before enabling SR-IOV capabilities. Updating this
 100entry will not affect VFs which are already probed.
 101::
 102
 103        echo  0 > \
 104        /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_drivers_autoprobe
 105
 106Usage example
 107-------------
 108
 109Following piece of code illustrates the usage of the SR-IOV API.
 110::
 111
 112        static int dev_probe(struct pci_dev *dev, const struct pci_device_id *id)
 113        {
 114                pci_enable_sriov(dev, NR_VIRTFN);
 115
 116                ...
 117
 118                return 0;
 119        }
 120
 121        static void dev_remove(struct pci_dev *dev)
 122        {
 123                pci_disable_sriov(dev);
 124
 125                ...
 126        }
 127
 128        static int dev_suspend(struct pci_dev *dev, pm_message_t state)
 129        {
 130                ...
 131
 132                return 0;
 133        }
 134
 135        static int dev_resume(struct pci_dev *dev)
 136        {
 137                ...
 138
 139                return 0;
 140        }
 141
 142        static void dev_shutdown(struct pci_dev *dev)
 143        {
 144                ...
 145        }
 146
 147        static int dev_sriov_configure(struct pci_dev *dev, int numvfs)
 148        {
 149                if (numvfs > 0) {
 150                        ...
 151                        pci_enable_sriov(dev, numvfs);
 152                        ...
 153                        return numvfs;
 154                }
 155                if (numvfs == 0) {
 156                        ....
 157                        pci_disable_sriov(dev);
 158                        ...
 159                        return 0;
 160                }
 161        }
 162
 163        static struct pci_driver dev_driver = {
 164                .name =         "SR-IOV Physical Function driver",
 165                .id_table =     dev_id_table,
 166                .probe =        dev_probe,
 167                .remove =       dev_remove,
 168                .suspend =      dev_suspend,
 169                .resume =       dev_resume,
 170                .shutdown =     dev_shutdown,
 171                .sriov_configure = dev_sriov_configure,
 172        };
 173