mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-09-22 01:07:57 +00:00
hv: vmsi: add vmsix on msi emulation support
Some passthrough devices require multiple MSI vectors, but don't support MSI-X. In meanwhile, Linux kernel doesn't support continuous vector allocation. On native platform, this issue can be mitigated by IOMMU via interrupt remapping. However, on ACRN, there is no vIOMMU. vMSI-X on MSI emulation is one solution to mitigate this problem on ACRN. This patch adds MSI-X emulation on MSI capability. For the device needs to do MSI-X emulation, HV will hide MSI capability and present MSI-X capability to guest. The guest driver may need to modify to reqeust MSI-X vector. For example: ret = pci_alloc_irq_vectors(pdev, 1, STMMAC_MSI_VEC_MAX, - PCI_IRQ_MSI); + PCI_IRQ_MSI | PCI_IRQ_MSIX); To enable MSI-X emulation, the device should: - 1. The device should be in vmsix_on_msi_devs array. - 2. Support MSI, but don't support MSI-X. - 3. MSI capability should support per-vector mask. - 4. The device should have an unused BAR. - 5. The device driver should not rely on PBA for functionality. Tracked-On: #4831 Signed-off-by: Binbin Wu <binbin.wu@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
@@ -228,6 +228,9 @@ struct pci_pdev {
|
||||
|
||||
/* IOMMU responsible for DMA and Interrupt Remapping for this device */
|
||||
uint32_t drhd_index;
|
||||
/* Used for vMSI-x on MSI emulation */
|
||||
uint16_t irte_start;
|
||||
uint16_t irte_count;
|
||||
|
||||
/* The bar info of the physical PCI device. */
|
||||
uint32_t nr_bars; /* 6 for normal device, 2 for bridge, 1 for cardbus */
|
||||
@@ -359,4 +362,5 @@ bool is_plat_hidden_pdev(union pci_bdf bdf);
|
||||
bool pdev_need_bar_restore(const struct pci_pdev *pdev);
|
||||
void pdev_restore_bar(const struct pci_pdev *pdev);
|
||||
void pci_switch_to_mmio_cfg_ops(void);
|
||||
void reserve_vmsix_on_msi_irtes(struct pci_pdev *pdev);
|
||||
#endif /* PCI_H_ */
|
||||
|
Reference in New Issue
Block a user