From: Dimitri Daskalakis <daskald@meta.com>
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