PCI: dwc: Convert struct pcie_port.msi_irq to an array
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>
This commit is contained in:
parent
226ec08749
commit
db388348ac
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue