From: Sumit Semwal sumit.semwal@linaro.org
This patch has been added to the stable tree. If you have any objections, please let us know.
===============
[ Upstream commit f40ec3c748c6912f6266c56a7f7992de61b255ed ]
Previously we enabled VFs and enable their memory space before calling pcibios_sriov_enable(). But pcibios_sriov_enable() may update the VF BARs: for example, on PPC PowerNV we may change them to manage the association of VFs to PEs.
Because 64-bit BARs cannot be updated atomically, it's unsafe to update them while they're enabled. The half-updated state may conflict with other devices in the system.
Call pcibios_sriov_enable() before enabling the VFs so any BAR updates happen while the VF BARs are disabled.
[bhelgaas: changelog] Tested-by: Carol Soto clsoto@us.ibm.com Signed-off-by: Gavin Shan gwshan@linux.vnet.ibm.com Signed-off-by: Bjorn Helgaas bhelgaas@google.com
Signed-off-by: Sasha Levin alexander.levin@microsoft.com --- drivers/pci/iov.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index 846d4f604ebd..089a1f41e44e 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -302,13 +302,6 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) return rc; }
- pci_iov_set_numvfs(dev, nr_virtfn); - iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE; - pci_cfg_access_lock(dev); - pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); - msleep(100); - pci_cfg_access_unlock(dev); - iov->initial_VFs = initial; if (nr_virtfn < initial) initial = nr_virtfn; @@ -319,6 +312,13 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) return retval; }
+ pci_iov_set_numvfs(dev, nr_virtfn); + iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE; + pci_cfg_access_lock(dev); + pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); + msleep(100); + pci_cfg_access_unlock(dev); + for (i = 0; i < initial; i++) { rc = virtfn_add(dev, i, 0); if (rc)