From: Dimitri Daskalakis <[email protected]> Scalable I/O Virtualization (SIOV) is the next-generation alternative to SR-IOV. The goal of SIOV is to support more virtual devices than SR-IOV can currently support, while relaxing many of the HW requirements of SR-IOV.
SIOV VFs are referred to as Scalable Device Interfaces (SDI). An SDI has a unique PCIe Routing ID (RID), but has no configuration space, BAR, or MSI-X table. An overview can be found here: https://pcisig.com/PCIExpress/ECN/Base/ScalableIOVirtualization Since SDIs lack HW support, the complexity will fall on software (hypervisors, vmms, drivers, and/or firmware) to provide the same isolation guarantees for SIOV that SR-IOV has today. This patch series is one step in that direction, allowing the PCI subsystem to discover the SIOV capability during enumeration. This was the minimum set of changes needed so I could test the SIOV feature of developmental HW in emulation. I have not tested a device that supports both SR-IOV and SIOV, but this combination is allowed per the spec. SIOV has two ways to assign RIDs, strided (like SR-IOV) or software assigned. To support software RID assignment, you need to compute the RID allowlist after all PCI devices have been enumerated. I've deferred this complexity for now and only implemented strided RID assignment. Patch 1 adds helpers to identify if a PF/VF is a SR-IOV PF/VF. The PF and VF bits within struct pci_dev should be agnostic of virtualization type. The helper uses the current logic which assumes any PF/VF is SR-IOV. Patch 2-7 uses the new helpers throughout core. I didn't convert certain device drivers (drivers/net, drivers/gpu) because the devices will not suddenly start advertising the SIOV capability. These can be updated in the future if desired. Patch 8 tightens the helpers introduced in patch 1 with a new is_sriov bit. Patch 9 is a small refactor for computing VF RID which can be shared between SR-IOV and SIOV. Patch 10-12 add SIOV definitions, capability detection, and bus reservation. With this patchset core enumarates the SIOV capability and can identify SIOV PFs. But there is no central mechanism to allocate/manage SIOV VFs. To support device pass through, devices will need to add a vfio-mdev driver with IOMMUFD support (or something similar). Dimitri Daskalakis (12): PCI: Add helpers to identify SR-IOV PFs/VFs. PCI: Convert iov.c to pci_is_sriov_* helpers PCI: Convert pci.h to pci_is_sriov_* helpers PCI: Convert arch/powerpc to pci_is_sriov_* helpers PCI: Convert s390/pci/pci.c to pci_is_sriov_* helpers PCI: Convert vfio_pci_core.c to pci_is_sriov_* helpers PCI: Convert xen-pciback and pci-driver to pci_is_sriov_* helpers PCI: Add is_sriov bit to struct pci_dev PCI: Add helper to compute VF Routing ID to pci.h PCI: Add Scalable I/O Virtualization data structure definitions PCI: Initialize and release SIOV capability PCI: Reserve bus range for SIOV devices arch/powerpc/kernel/pci_dn.c | 4 +- arch/powerpc/platforms/powernv/pci-ioda.c | 6 +- arch/powerpc/platforms/powernv/pci-sriov.c | 10 +- arch/powerpc/platforms/pseries/eeh_pseries.c | 8 +- arch/powerpc/platforms/pseries/setup.c | 4 +- arch/s390/pci/pci.c | 2 +- arch/s390/pci/pci_iov.c | 1 + drivers/pci/Kconfig | 11 ++ drivers/pci/Makefile | 1 + drivers/pci/iov.c | 58 ++++---- drivers/pci/pci-driver.c | 4 +- drivers/pci/pci.h | 43 +++++- drivers/pci/probe.c | 6 +- drivers/pci/siov.c | 134 +++++++++++++++++++ drivers/vfio/pci/vfio_pci_core.c | 12 +- drivers/xen/xen-pciback/pci_stub.c | 2 +- include/linux/pci.h | 29 +++- include/uapi/linux/pci_regs.h | 12 +- 18 files changed, 289 insertions(+), 58 deletions(-) create mode 100644 drivers/pci/siov.c -- 2.52.0
