@ -8481,7 +8481,8 @@ out:
return pow2ceil ( bar_size ) ;
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 ?
uint16_t vf_dev_id = n - > params . use_intel_id ?
PCI_DEVICE_ID_INTEL_NVME : PCI_DEVICE_ID_REDHAT_NVME ;
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 ) ,
le16_to_cpu ( cap - > vifrsm ) ,
NULL , NULL ) ;
NULL , NULL ) ;
pcie_sriov_pf_init ( pci_dev , offset , " nvme " , vf_dev_id ,
if ( ! pcie_sriov_pf_init ( pci_dev , offset , " nvme " , vf_dev_id ,
n - > params . sriov_max_vfs , n - > params . sriov_max_vfs ,
n - > params . sriov_max_vfs , n - > params . sriov_max_vfs ,
NVME_VF_OFFSET , NVME_VF_STRIDE ) ;
NVME_VF_OFFSET , NVME_VF_STRIDE , errp ) ) {
return false ;
}
pcie_sriov_pf_init_vf_bar ( pci_dev , 0 , PCI_BASE_ADDRESS_SPACE_MEMORY |
pcie_sriov_pf_init_vf_bar ( pci_dev , 0 , PCI_BASE_ADDRESS_SPACE_MEMORY |
PCI_BASE_ADDRESS_MEM_TYPE_64 , bar_size ) ;
PCI_BASE_ADDRESS_MEM_TYPE_64 , bar_size ) ;
return true ;
}
}
static int nvme_add_pm_capability ( PCIDevice * pci_dev , uint8_t offset )
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 ;
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 ) ;
nvme_update_msixcap_ts ( pci_dev , n - > conf_msix_qsize ) ;
pcie_cap_deverr_init ( pci_dev ) ;
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 ) ;
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 ;
return true ;
}
}