Commit db388348 authored by Dmitry Baryshkov's avatar Dmitry Baryshkov Committed by Bjorn Helgaas
Browse files

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: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarRob Herring <robh@kernel.org>
Reviewed-by: default avatarJohan Hovold <johan+linaro@kernel.org>
Reviewed-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
parent 226ec087
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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)
+1 −1
Original line number Diff line number Diff line
@@ -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) {
+18 −11
Original line number Diff line number Diff line
@@ -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,
	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)
+1 −1
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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)
Loading