|
@@ -8481,7 +8481,8 @@ out:
|
|
|
return pow2ceil(bar_size);
|
|
|
}
|
|
|
|
|
|
-static void nvme_init_sriov(NvmeCtrl *n, PCIDevice *pci_dev, uint16_t offset)
|
|
|
+static bool nvme_init_sriov(NvmeCtrl *n, PCIDevice *pci_dev, uint16_t offset,
|
|
|
+ Error **errp)
|
|
|
{
|
|
|
uint16_t vf_dev_id = n->params.use_intel_id ?
|
|
|
PCI_DEVICE_ID_INTEL_NVME : PCI_DEVICE_ID_REDHAT_NVME;
|
|
@@ -8490,12 +8491,16 @@ static void nvme_init_sriov(NvmeCtrl *n, PCIDevice *pci_dev, uint16_t offset)
|
|
|
le16_to_cpu(cap->vifrsm),
|
|
|
NULL, NULL);
|
|
|
|
|
|
- pcie_sriov_pf_init(pci_dev, offset, "nvme", vf_dev_id,
|
|
|
- n->params.sriov_max_vfs, n->params.sriov_max_vfs,
|
|
|
- NVME_VF_OFFSET, NVME_VF_STRIDE);
|
|
|
+ if (!pcie_sriov_pf_init(pci_dev, offset, "nvme", vf_dev_id,
|
|
|
+ n->params.sriov_max_vfs, n->params.sriov_max_vfs,
|
|
|
+ NVME_VF_OFFSET, NVME_VF_STRIDE, errp)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
pcie_sriov_pf_init_vf_bar(pci_dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY |
|
|
|
PCI_BASE_ADDRESS_MEM_TYPE_64, bar_size);
|
|
|
+
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
static int nvme_add_pm_capability(PCIDevice *pci_dev, uint8_t offset)
|
|
@@ -8620,6 +8625,11 @@ static bool nvme_init_pci(NvmeCtrl *n, PCIDevice *pci_dev, Error **errp)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ if (!pci_is_vf(pci_dev) && n->params.sriov_max_vfs &&
|
|
|
+ !nvme_init_sriov(n, pci_dev, 0x120, errp)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
nvme_update_msixcap_ts(pci_dev, n->conf_msix_qsize);
|
|
|
|
|
|
pcie_cap_deverr_init(pci_dev);
|
|
@@ -8649,10 +8659,6 @@ static bool nvme_init_pci(NvmeCtrl *n, PCIDevice *pci_dev, Error **errp)
|
|
|
nvme_init_pmr(n, pci_dev);
|
|
|
}
|
|
|
|
|
|
- if (!pci_is_vf(pci_dev) && n->params.sriov_max_vfs) {
|
|
|
- nvme_init_sriov(n, pci_dev, 0x120);
|
|
|
- }
|
|
|
-
|
|
|
return true;
|
|
|
}
|
|
|
|