Allow dynamic MSI-X vector allocation for pci_hyperv PCI controller
by adding support for the flag MSI_FLAG_PCI_MSIX_ALLOC_DYN and using
pci_msix_prepare_desc() to prepare the descriptors.

Signed-off-by: Shradha Gupta <shradhagu...@linux.microsoft.com>
Reviewed-by: Haiyang Zhang <haiya...@microsoft.com>
---
 Changes in v2:
 * split the patch to keep changes in PCI and pci_hyperv controller
   seperate
 * replace strings "pci vectors" by "MSI-X vectors"
---
 drivers/pci/controller/pci-hyperv.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/controller/pci-hyperv.c 
b/drivers/pci/controller/pci-hyperv.c
index ac27bda5ba26..f2fa6bdb6bb8 100644
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -598,7 +598,8 @@ static unsigned int hv_msi_get_int_vector(struct irq_data 
*data)
        return cfg->vector;
 }
 
-#define hv_msi_prepare         pci_msi_prepare
+#define hv_msi_prepare                 pci_msi_prepare
+#define hv_msix_prepare_desc           pci_msix_prepare_desc
 
 /**
  * hv_arch_irq_unmask() - "Unmask" the IRQ by setting its current
@@ -727,6 +728,7 @@ static void hv_arch_irq_unmask(struct irq_data *data)
 #define FLOW_HANDLER           NULL
 #define FLOW_NAME              NULL
 #define hv_msi_prepare         NULL
+#define hv_msix_prepare_desc   NULL
 
 struct hv_pci_chip_data {
        DECLARE_BITMAP(spi_map, HV_PCI_MSI_SPI_NR);
@@ -2063,6 +2065,7 @@ static struct irq_chip hv_msi_irq_chip = {
 static struct msi_domain_ops hv_msi_ops = {
        .msi_prepare    = hv_msi_prepare,
        .msi_free       = hv_msi_free,
+       .prepare_desc   = hv_msix_prepare_desc,
 };
 
 /**
@@ -2084,7 +2087,7 @@ static int hv_pcie_init_irq_domain(struct 
hv_pcibus_device *hbus)
        hbus->msi_info.ops = &hv_msi_ops;
        hbus->msi_info.flags = (MSI_FLAG_USE_DEF_DOM_OPS |
                MSI_FLAG_USE_DEF_CHIP_OPS | MSI_FLAG_MULTI_PCI_MSI |
-               MSI_FLAG_PCI_MSIX);
+               MSI_FLAG_PCI_MSIX | MSI_FLAG_PCI_MSIX_ALLOC_DYN);
        hbus->msi_info.handler = FLOW_HANDLER;
        hbus->msi_info.handler_name = FLOW_NAME;
        hbus->msi_info.data = hbus;
-- 
2.34.1


Reply via email to