Documentation: PCI: convert pci-iov-howto.txt to reST

Convert plain text documentation to reStructuredText format and add it to
Sphinx TOC tree.  No essential content change.

Signed-off-by: Changbin Du <changbin.du@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
Changbin Du 2019-05-14 22:47:26 +08:00 committed by Bjorn Helgaas
parent 2e64224448
commit 4d2c729c62
2 changed files with 101 additions and 75 deletions

View File

@ -10,3 +10,4 @@ Linux PCI Bus Subsystem
pci pci
picebus-howto picebus-howto
pci-iov-howto

View File

@ -1,14 +1,19 @@
PCI Express I/O Virtualization Howto .. SPDX-License-Identifier: GPL-2.0
Copyright (C) 2009 Intel Corporation .. include:: <isonum.txt>
Yu Zhao <yu.zhao@intel.com>
Update: November 2012 ====================================
-- sysfs-based SRIOV enable-/disable-ment PCI Express I/O Virtualization Howto
Donald Dutile <ddutile@redhat.com> ====================================
1. Overview :Copyright: |copy| 2009 Intel Corporation
:Authors: - Yu Zhao <yu.zhao@intel.com>
- Donald Dutile <ddutile@redhat.com>
1.1 What is SR-IOV Overview
========
What is SR-IOV
--------------
Single Root I/O Virtualization (SR-IOV) is a PCI Express Extended Single Root I/O Virtualization (SR-IOV) is a PCI Express Extended
capability which makes one physical device appear as multiple virtual capability which makes one physical device appear as multiple virtual
@ -23,9 +28,11 @@ Memory Space, which is used to map its register set. VF device driver
operates on the register set so it can be functional and appear as a operates on the register set so it can be functional and appear as a
real existing PCI device. real existing PCI device.
2. User Guide User Guide
==========
2.1 How can I enable SR-IOV capability How can I enable SR-IOV capability
----------------------------------
Multiple methods are available for SR-IOV enablement. Multiple methods are available for SR-IOV enablement.
In the first method, the device driver (PF driver) will control the In the first method, the device driver (PF driver) will control the
@ -43,105 +50,123 @@ checks, e.g., check numvfs == 0 if enabling VFs, ensure
numvfs <= totalvfs. numvfs <= totalvfs.
The second method is the recommended method for new/future VF devices. The second method is the recommended method for new/future VF devices.
2.2 How can I use the Virtual Functions How can I use the Virtual Functions
-----------------------------------
The VF is treated as hot-plugged PCI devices in the kernel, so they The VF is treated as hot-plugged PCI devices in the kernel, so they
should be able to work in the same way as real PCI devices. The VF should be able to work in the same way as real PCI devices. The VF
requires device driver that is same as a normal PCI device's. requires device driver that is same as a normal PCI device's.
3. Developer Guide Developer Guide
===============
3.1 SR-IOV API SR-IOV API
----------
To enable SR-IOV capability: To enable SR-IOV capability:
(a) For the first method, in the driver:
(a) For the first method, in the driver::
int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);
'nr_virtfn' is number of VFs to be enabled.
(b) For the second method, from sysfs: 'nr_virtfn' is number of VFs to be enabled.
(b) For the second method, from sysfs::
echo 'nr_virtfn' > \ echo 'nr_virtfn' > \
/sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_numvfs /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_numvfs
To disable SR-IOV capability: To disable SR-IOV capability:
(a) For the first method, in the driver:
(a) For the first method, in the driver::
void pci_disable_sriov(struct pci_dev *dev); void pci_disable_sriov(struct pci_dev *dev);
(b) For the second method, from sysfs:
(b) For the second method, from sysfs::
echo 0 > \ echo 0 > \
/sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_numvfs /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_numvfs
To enable auto probing VFs by a compatible driver on the host, run To enable auto probing VFs by a compatible driver on the host, run
command below before enabling SR-IOV capabilities. This is the command below before enabling SR-IOV capabilities. This is the
default behavior. default behavior.
::
echo 1 > \ echo 1 > \
/sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_drivers_autoprobe /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_drivers_autoprobe
To disable auto probing VFs by a compatible driver on the host, run To disable auto probing VFs by a compatible driver on the host, run
command below before enabling SR-IOV capabilities. Updating this command below before enabling SR-IOV capabilities. Updating this
entry will not affect VFs which are already probed. entry will not affect VFs which are already probed.
::
echo 0 > \ echo 0 > \
/sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_drivers_autoprobe /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_drivers_autoprobe
3.2 Usage example Usage example
-------------
Following piece of code illustrates the usage of the SR-IOV API. Following piece of code illustrates the usage of the SR-IOV API.
::
static int dev_probe(struct pci_dev *dev, const struct pci_device_id *id) static int dev_probe(struct pci_dev *dev, const struct pci_device_id *id)
{ {
pci_enable_sriov(dev, NR_VIRTFN); pci_enable_sriov(dev, NR_VIRTFN);
...
return 0;
}
static void dev_remove(struct pci_dev *dev)
{
pci_disable_sriov(dev);
...
}
static int dev_suspend(struct pci_dev *dev, pm_message_t state)
{
...
return 0;
}
static int dev_resume(struct pci_dev *dev)
{
...
return 0;
}
static void dev_shutdown(struct pci_dev *dev)
{
...
}
static int dev_sriov_configure(struct pci_dev *dev, int numvfs)
{
if (numvfs > 0) {
...
pci_enable_sriov(dev, numvfs);
...
return numvfs;
}
if (numvfs == 0) {
....
pci_disable_sriov(dev);
... ...
return 0; return 0;
} }
}
static struct pci_driver dev_driver = { static void dev_remove(struct pci_dev *dev)
.name = "SR-IOV Physical Function driver", {
.id_table = dev_id_table, pci_disable_sriov(dev);
.probe = dev_probe,
.remove = dev_remove, ...
.suspend = dev_suspend, }
.resume = dev_resume,
.shutdown = dev_shutdown, static int dev_suspend(struct pci_dev *dev, pm_message_t state)
.sriov_configure = dev_sriov_configure, {
}; ...
return 0;
}
static int dev_resume(struct pci_dev *dev)
{
...
return 0;
}
static void dev_shutdown(struct pci_dev *dev)
{
...
}
static int dev_sriov_configure(struct pci_dev *dev, int numvfs)
{
if (numvfs > 0) {
...
pci_enable_sriov(dev, numvfs);
...
return numvfs;
}
if (numvfs == 0) {
....
pci_disable_sriov(dev);
...
return 0;
}
}
static struct pci_driver dev_driver = {
.name = "SR-IOV Physical Function driver",
.id_table = dev_id_table,
.probe = dev_probe,
.remove = dev_remove,
.suspend = dev_suspend,
.resume = dev_resume,
.shutdown = dev_shutdown,
.sriov_configure = dev_sriov_configure,
};