]> git.baikalelectronics.ru Git - kernel.git/commitdiff
PCI: dwc: Convert struct pcie_port.msi_irq to an array
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Fri, 22 Jul 2022 16:34:12 +0000 (11:34 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 1 Aug 2022 20:15:33 +0000 (15:15 -0500)
The Qualcomm DWC PCIe controller supports more than 32 MSI interrupts, but
they are routed to separate interrupts in groups of 32 vectors. To support
this configuration, change the msi_irq field to an array. Let the DWC core
handle all interrupts that were set in this array.

[bhelgaas: reorder, drop "irq" temporary to make patch cleaner]
Link: https://lore.kernel.org/r/20220707134733.2436629-3-dmitry.baryshkov@linaro.org
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Reviewed-by: Johan Hovold <johan+linaro@kernel.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
drivers/pci/controller/dwc/pci-dra7xx.c
drivers/pci/controller/dwc/pci-exynos.c
drivers/pci/controller/dwc/pcie-designware-host.c
drivers/pci/controller/dwc/pcie-designware.h
drivers/pci/controller/dwc/pcie-keembay.c
drivers/pci/controller/dwc/pcie-spear13xx.c
drivers/pci/controller/dwc/pcie-tegra194.c

index a174b680b2a795598094c36418db7116c136cc6f..e2a6e18e533ca87678910dd480bc06f8a4079187 100644 (file)
@@ -483,7 +483,7 @@ static int dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx,
                return pp->irq;
 
        /* MSI IRQ is muxed */
-       pp->msi_irq = -ENODEV;
+       pp->msi_irq[0] = -ENODEV;
 
        ret = dra7xx_pcie_init_irq_domain(pp);
        if (ret < 0)
index 2044d191fba6b6d94e7e230b297628f1b63de1a9..2ede426e3295fc6f30de6c8b51df8a1ef3b35efe 100644 (file)
@@ -292,7 +292,7 @@ static int exynos_add_pcie_port(struct exynos_pcie *ep,
        }
 
        pp->ops = &exynos_pcie_host_ops;
-       pp->msi_irq = -ENODEV;
+       pp->msi_irq[0] = -ENODEV;
 
        ret = dw_pcie_host_init(pp);
        if (ret) {
index f96c4d00a53efb10ae95ceb159a3822f53003303..89316967c0703fcac8c80678ddb79a4fae5615eb 100644 (file)
@@ -257,8 +257,13 @@ int dw_pcie_allocate_domains(struct dw_pcie_rp *pp)
 
 static void dw_pcie_free_msi(struct dw_pcie_rp *pp)
 {
-       if (pp->msi_irq > 0)
-               irq_set_chained_handler_and_data(pp->msi_irq, NULL, NULL);
+       u32 ctrl;
+
+       for (ctrl = 0; ctrl < MAX_MSI_CTRLS; ctrl++) {
+               if (pp->msi_irq[ctrl] > 0)
+                       irq_set_chained_handler_and_data(pp->msi_irq[ctrl],
+                                                        NULL, NULL);
+       }
 
        irq_domain_remove(pp->msi_domain);
        irq_domain_remove(pp->irq_domain);
@@ -298,12 +303,12 @@ static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
        for (ctrl = 0; ctrl < num_ctrls; ctrl++)
                pp->irq_mask[ctrl] = ~0;
 
-       if (!pp->msi_irq) {
-               pp->msi_irq = platform_get_irq_byname_optional(pdev, "msi");
-               if (pp->msi_irq < 0) {
-                       pp->msi_irq = platform_get_irq(pdev, 0);
-                       if (pp->msi_irq < 0)
-                               return pp->msi_irq;
+       if (!pp->msi_irq[0]) {
+               pp->msi_irq[0] = platform_get_irq_byname_optional(pdev, "msi");
+               if (pp->msi_irq[0] < 0) {
+                       pp->msi_irq[0] = platform_get_irq(pdev, 0);
+                       if (pp->msi_irq[0] < 0)
+                               return pp->msi_irq[0];
                }
        }
 
@@ -313,9 +318,11 @@ static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
        if (ret)
                return ret;
 
-       if (pp->msi_irq > 0)
-               irq_set_chained_handler_and_data(pp->msi_irq,
-                                           dw_chained_msi_isr, pp);
+       for (ctrl = 0; ctrl < num_ctrls; ctrl++) {
+               if (pp->msi_irq[ctrl] > 0)
+                       irq_set_chained_handler_and_data(pp->msi_irq[ctrl],
+                                                   dw_chained_msi_isr, pp);
+       }
 
        ret = dma_set_mask(dev, DMA_BIT_MASK(32));
        if (ret)
index 7c63204d23ba7a6b0a42b8ee7be7b7497dbade79..16489c629ac22866966b6f96d9e3176b3b1bd9bf 100644 (file)
@@ -200,7 +200,7 @@ struct dw_pcie_rp {
        u32                     io_size;
        int                     irq;
        const struct dw_pcie_host_ops *ops;
-       int                     msi_irq;
+       int                     msi_irq[MAX_MSI_CTRLS];
        struct irq_domain       *irq_domain;
        struct irq_domain       *msi_domain;
        dma_addr_t              msi_data;
index 58f3caf75cff113abc8bb14d825690f52d025f21..f90f36bac0185b7a6cd1b61c43ffb52f843e3eee 100644 (file)
@@ -338,7 +338,7 @@ static int keembay_pcie_add_pcie_port(struct keembay_pcie *pcie,
        int ret;
 
        pp->ops = &keembay_pcie_host_ops;
-       pp->msi_irq = -ENODEV;
+       pp->msi_irq[0] = -ENODEV;
 
        ret = keembay_pcie_setup_msi_irq(pcie);
        if (ret)
index 7fd698da144ece17a2e73b4849aac3ae8072df5e..9d933e0e12e684853c949644942924cb6ec3bbf7 100644 (file)
@@ -172,7 +172,7 @@ static int spear13xx_add_pcie_port(struct spear13xx_pcie *spear13xx_pcie,
        }
 
        pp->ops = &spear13xx_pcie_host_ops;
-       pp->msi_irq = -ENODEV;
+       pp->msi_irq[0] = -ENODEV;
 
        ret = dw_pcie_host_init(pp);
        if (ret) {
index e497e6de8d1556ce15defd0b70fcc4188835188c..53d26f7efa3c6ca9c297e015ad707564ed6dd0e5 100644 (file)
@@ -2261,7 +2261,7 @@ static void tegra194_pcie_shutdown(struct platform_device *pdev)
 
        disable_irq(pcie->pci.pp.irq);
        if (IS_ENABLED(CONFIG_PCI_MSI))
-               disable_irq(pcie->pci.pp.msi_irq);
+               disable_irq(pcie->pci.pp.msi_irq[0]);
 
        tegra194_pcie_pme_turnoff(pcie);
        tegra_pcie_unconfig_controller(pcie);