1 PCI Express I/O Virtualization Howto 2 Copyright (C) 2009 Intel Corporation 3 Yu Zhao <yu.zhao@intel.com> 4 5 61. Overview 7 81.1 What is SR-IOV 9 10Single Root I/O Virtualization (SR-IOV) is a PCI Express Extended 11capability which makes one physical device appear as multiple virtual 12devices. The physical device is referred to as Physical Function (PF) 13while the virtual devices are referred to as Virtual Functions (VF). 14Allocation of the VF can be dynamically controlled by the PF via 15registers encapsulated in the capability. By default, this feature is 16not enabled and the PF behaves as traditional PCIe device. Once it's 17turned on, each VF's PCI configuration space can be accessed by its own 18Bus, Device and Function Number (Routing ID). And each VF also has PCI 19Memory Space, which is used to map its register set. VF device driver 20operates on the register set so it can be functional and appear as a 21real existing PCI device. 22 232. User Guide 24 252.1 How can I enable SR-IOV capability 26 27The device driver (PF driver) will control the enabling and disabling 28of the capability via API provided by SR-IOV core. If the hardware 29has SR-IOV capability, loading its PF driver would enable it and all 30VFs associated with the PF. 31 322.2 How can I use the Virtual Functions 33 34The VF is treated as hot-plugged PCI devices in the kernel, so they 35should be able to work in the same way as real PCI devices. The VF 36requires device driver that is same as a normal PCI device's. 37 383. Developer Guide 39 403.1 SR-IOV API 41 42To enable SR-IOV capability: 43 int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); 44 'nr_virtfn' is number of VFs to be enabled. 45 46To disable SR-IOV capability: 47 void pci_disable_sriov(struct pci_dev *dev); 48 49To notify SR-IOV core of Virtual Function Migration: 50 irqreturn_t pci_sriov_migration(struct pci_dev *dev); 51 523.2 Usage example 53 54Following piece of code illustrates the usage of the SR-IOV API. 55 56static int __devinit dev_probe(struct pci_dev *dev, const struct pci_device_id *id) 57{ 58 pci_enable_sriov(dev, NR_VIRTFN); 59 60 ... 61 62 return 0; 63} 64 65static void __devexit dev_remove(struct pci_dev *dev) 66{ 67 pci_disable_sriov(dev); 68 69 ... 70} 71 72static int dev_suspend(struct pci_dev *dev, pm_message_t state) 73{ 74 ... 75 76 return 0; 77} 78 79static int dev_resume(struct pci_dev *dev) 80{ 81 ... 82 83 return 0; 84} 85 86static void dev_shutdown(struct pci_dev *dev) 87{ 88 ... 89} 90 91static struct pci_driver dev_driver = { 92 .name = "SR-IOV Physical Function driver", 93 .id_table = dev_id_table, 94 .probe = dev_probe, 95 .remove = __devexit_p(dev_remove), 96 .suspend = dev_suspend, 97 .resume = dev_resume, 98 .shutdown = dev_shutdown, 99}; 100