mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
PCI: Do any VF BAR updates before enabling the BARs
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>
This commit is contained in:
parent
1600f62534
commit
f40ec3c748
@ -306,13 +306,6 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
|
|||||||
return rc;
|
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;
|
iov->initial_VFs = initial;
|
||||||
if (nr_virtfn < initial)
|
if (nr_virtfn < initial)
|
||||||
initial = nr_virtfn;
|
initial = nr_virtfn;
|
||||||
@ -323,6 +316,13 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
|
|||||||
goto err_pcibios;
|
goto err_pcibios;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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++) {
|
for (i = 0; i < initial; i++) {
|
||||||
rc = pci_iov_add_virtfn(dev, i, 0);
|
rc = pci_iov_add_virtfn(dev, i, 0);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
Loading…
Reference in New Issue
Block a user