]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: endpoint: Add support to link a physical function to a virtual function
authorKishon Vijay Abraham I <kishon@ti.com>
Thu, 19 Aug 2021 12:33:38 +0000 (18:03 +0530)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Thu, 19 Aug 2021 13:13:28 +0000 (14:13 +0100)
While the physical function has to be linked to endpoint controller, the
virtual function has to be linked to a physical function. Add support to
link a physical function to a virtual function in pci-ep-cfs.

Link: https://lore.kernel.org/r/20210819123343.1951-4-kishon@ti.com
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
drivers/pci/endpoint/pci-ep-cfs.c

index f3a8b833b4790ef0604e5a4c4b42311bcc959e17..999911801877e20d432e5e5c28d347e8e0e4e711 100644 (file)
@@ -475,6 +475,28 @@ static struct configfs_attribute *pci_epf_attrs[] = {
        NULL,
 };
 
+static int pci_epf_vepf_link(struct config_item *epf_pf_item,
+                            struct config_item *epf_vf_item)
+{
+       struct pci_epf_group *epf_vf_group = to_pci_epf_group(epf_vf_item);
+       struct pci_epf_group *epf_pf_group = to_pci_epf_group(epf_pf_item);
+       struct pci_epf *epf_pf = epf_pf_group->epf;
+       struct pci_epf *epf_vf = epf_vf_group->epf;
+
+       return pci_epf_add_vepf(epf_pf, epf_vf);
+}
+
+static void pci_epf_vepf_unlink(struct config_item *epf_pf_item,
+                               struct config_item *epf_vf_item)
+{
+       struct pci_epf_group *epf_vf_group = to_pci_epf_group(epf_vf_item);
+       struct pci_epf_group *epf_pf_group = to_pci_epf_group(epf_pf_item);
+       struct pci_epf *epf_pf = epf_pf_group->epf;
+       struct pci_epf *epf_vf = epf_vf_group->epf;
+
+       pci_epf_remove_vepf(epf_pf, epf_vf);
+}
+
 static void pci_epf_release(struct config_item *item)
 {
        struct pci_epf_group *epf_group = to_pci_epf_group(item);
@@ -487,6 +509,8 @@ static void pci_epf_release(struct config_item *item)
 }
 
 static struct configfs_item_operations pci_epf_ops = {
+       .allow_link             = pci_epf_vepf_link,
+       .drop_link              = pci_epf_vepf_unlink,
        .release                = pci_epf_release,
 };