diff options
author | Tony Lindgren <tony@atomide.com> | 2019-10-04 09:06:41 -0700 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2019-10-04 09:06:41 -0700 |
commit | 1913c7f3fc2514e09262baf2267a82dfdb215c39 (patch) | |
tree | 1aaf6970e99c1f5535776f9fd9067f0d811b2532 /drivers/fpga/dfl-pci.c | |
parent | f90ec6cdf674248dcad85bf9af6e064bf472b841 (diff) | |
parent | 96d49bbfe6c1a6bb43ccd00fb87aca100e32e5e2 (diff) |
Merge tag 'fix-missing-panels' into fixes
Diffstat (limited to 'drivers/fpga/dfl-pci.c')
-rw-r--r-- | drivers/fpga/dfl-pci.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/fpga/dfl-pci.c b/drivers/fpga/dfl-pci.c index 66b5720582bb..89ca292236ad 100644 --- a/drivers/fpga/dfl-pci.c +++ b/drivers/fpga/dfl-pci.c @@ -223,8 +223,43 @@ disable_error_report_exit: return ret; } +static int cci_pci_sriov_configure(struct pci_dev *pcidev, int num_vfs) +{ + struct cci_drvdata *drvdata = pci_get_drvdata(pcidev); + struct dfl_fpga_cdev *cdev = drvdata->cdev; + int ret = 0; + + if (!num_vfs) { + /* + * disable SRIOV and then put released ports back to default + * PF access mode. + */ + pci_disable_sriov(pcidev); + + dfl_fpga_cdev_config_ports_pf(cdev); + + } else { + /* + * before enable SRIOV, put released ports into VF access mode + * first of all. + */ + ret = dfl_fpga_cdev_config_ports_vf(cdev, num_vfs); + if (ret) + return ret; + + ret = pci_enable_sriov(pcidev, num_vfs); + if (ret) + dfl_fpga_cdev_config_ports_pf(cdev); + } + + return ret; +} + static void cci_pci_remove(struct pci_dev *pcidev) { + if (dev_is_pf(&pcidev->dev)) + cci_pci_sriov_configure(pcidev, 0); + cci_remove_feature_devs(pcidev); pci_disable_pcie_error_reporting(pcidev); } @@ -234,6 +269,7 @@ static struct pci_driver cci_pci_driver = { .id_table = cci_pcie_id_tbl, .probe = cci_pci_probe, .remove = cci_pci_remove, + .sriov_configure = cci_pci_sriov_configure, }; module_pci_driver(cci_pci_driver); |