]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
PCI/IOV: Add pci-pf-stub driver for PFs that only enable VFs
authorAlexander Duyck <alexander.h.duyck@intel.com>
Tue, 24 Apr 2018 21:47:16 +0000 (16:47 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 24 Apr 2018 21:47:16 +0000 (16:47 -0500)
Some SR-IOV PF devices provide no functionality other than acting as a
means of enabling VFs.  For these devices, we want to enable the VFs and
assign them to guest virtual machines, but there's no need to have a driver
for the PF itself.

Add a new pci-pf-stub driver to claim those PF devices and provide the
generic VF enable functionality.  An administrator can use the sysfs
"sriov_numvfs" file to enable VFs, then assign them to guests.

For now I only have one example ID provided by Amazon in terms of devices
that require this functionality.  The general idea is that in the future we
will see other devices added as vendors come up with devices where the PF
is more or less just a lightweight shim used to allocate VFs.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
[bhelgaas: changelog]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Greg Rose <gvrose8192@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
drivers/pci/Kconfig
drivers/pci/Makefile
drivers/pci/pci-pf-stub.c [new file with mode: 0644]
include/linux/pci_ids.h

index 34b56a8f8480ab7504375e60e7e7aebee4f4eb0c..cdef2a2a9bc5c3d35a963d56ea0363d981087505 100644 (file)
@@ -71,6 +71,18 @@ config PCI_STUB
 
          When in doubt, say N.
 
+config PCI_PF_STUB
+       tristate "PCI PF Stub driver"
+       depends on PCI
+       depends on PCI_IOV
+       help
+         Say Y or M here if you want to enable support for devices that
+         require SR-IOV support, while at the same time the PF itself is
+         not providing any actual services on the host itself such as
+         storage or networking.
+
+         When in doubt, say N.
+
 config XEN_PCIDEV_FRONTEND
         tristate "Xen PCI Frontend"
         depends on PCI && X86 && XEN
index 952addc7bacfd985c886962772ac92bd888ccb80..84c9eef6b1c3ea353c631ec19d29442173d34325 100644 (file)
@@ -24,6 +24,7 @@ obj-$(CONFIG_PCI_LABEL)               += pci-label.o
 obj-$(CONFIG_X86_INTEL_MID)    += pci-mid.o
 obj-$(CONFIG_PCI_SYSCALL)      += syscall.o
 obj-$(CONFIG_PCI_STUB)         += pci-stub.o
+obj-$(CONFIG_PCI_PF_STUB)      += pci-pf-stub.o
 obj-$(CONFIG_PCI_ECAM)         += ecam.o
 obj-$(CONFIG_XEN_PCIDEV_FRONTEND) += xen-pcifront.o
 
diff --git a/drivers/pci/pci-pf-stub.c b/drivers/pci/pci-pf-stub.c
new file mode 100644 (file)
index 0000000..9795649
--- /dev/null
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0
+/* pci-pf-stub - simple stub driver for PCI SR-IOV PF device
+ *
+ * This driver is meant to act as a "whitelist" for devices that provde
+ * SR-IOV functionality while at the same time not actually needing a
+ * driver of their own.
+ */
+
+#include <linux/module.h>
+#include <linux/pci.h>
+
+/**
+ * pci_pf_stub_whitelist - White list of devices to bind pci-pf-stub onto
+ *
+ * This table provides the list of IDs this driver is supposed to bind
+ * onto.  You could think of this as a list of "quirked" devices where we
+ * are adding support for SR-IOV here since there are no other drivers
+ * that they would be running under.
+ */
+static const struct pci_device_id pci_pf_stub_whitelist[] = {
+       { PCI_VDEVICE(AMAZON, 0x0053) },
+       /* required last entry */
+       { 0 }
+};
+MODULE_DEVICE_TABLE(pci, pci_pf_stub_whitelist);
+
+static int pci_pf_stub_probe(struct pci_dev *dev,
+                            const struct pci_device_id *id)
+{
+       pci_info(dev, "claimed by pci-pf-stub\n");
+       return 0;
+}
+
+static struct pci_driver pf_stub_driver = {
+       .name                   = "pci-pf-stub",
+       .id_table               = pci_pf_stub_whitelist,
+       .probe                  = pci_pf_stub_probe,
+       .sriov_configure        = pci_sriov_configure_simple,
+};
+
+static int __init pci_pf_stub_init(void)
+{
+       return pci_register_driver(&pf_stub_driver);
+}
+
+static void __exit pci_pf_stub_exit(void)
+{
+       pci_unregister_driver(&pf_stub_driver);
+}
+
+module_init(pci_pf_stub_init);
+module_exit(pci_pf_stub_exit);
+
+MODULE_LICENSE("GPL");
index cc608fc5533470f3c5f8645a2516f585ebc183a5..411c12287ddab75e0933dd4259299b91c675764b 100644 (file)
 #define PCI_VENDOR_ID_CIRCUITCO                0x1cc8
 #define PCI_SUBSYSTEM_ID_CIRCUITCO_MINNOWBOARD 0x0001
 
+#define PCI_VENDOR_ID_AMAZON           0x1d0f
+
 #define PCI_VENDOR_ID_TEKRAM           0x1de1
 #define PCI_DEVICE_ID_TEKRAM_DC290     0xdc29