Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7d67ff6a authored by Ke Huang's avatar Ke Huang
Browse files

msm: msi: Add MSI disable/enable when process MSI intierrupt



Hasting DP MSI has TX timer, RX timer, and other timer and if data
was not fetched by host in a short time, such as 8us, and then it
will trigger the MSI interrupt storm.
Currently the MSI can not be disabled when process MSI interrupt,
and it will casue the timer of interrupt storm triggered before
the interrupt processed by schedule, so the schedule can not be
called by the interrupt storm in this case, and then casue watchdog
bark.
So adding MSI disable/enable when process MSI intierrupt to make
the interrupt is disabled before it process completed, and then
re-enable this interrupt after it process completed.

Change-Id: I43fc1508528aa843cbad32e70032b9388c8e962a
Signed-off-by: default avatarKe Huang <keh@codeaurora.org>
parent e7663239
Loading
Loading
Loading
Loading
+36 −4
Original line number Diff line number Diff line
@@ -4951,13 +4951,45 @@ static void msm_pcie_msi_nop(struct irq_data *d)
{
}

static void msm_mask_msi_irq(struct irq_data *data)
{
	struct msi_desc *desc = irq_data_get_msi_desc(data);
	struct pci_dev *pdev;
	struct msm_pcie_dev_t *pcie_dev;
	void __iomem *intr_en_addr;
	uint32_t offset = 0;

	pdev = msi_desc_to_pci_dev(desc);
	pcie_dev = PCIE_BUS_PRIV_DATA(pdev->bus);
	offset = data->irq - desc->irq;
	intr_en_addr = pcie_dev->dm_core + PCIE20_MSI_CTRL_INTR_EN;
	msm_pcie_write_mask(intr_en_addr, BIT(offset), 0);
	pci_msi_mask_irq(data);
}

static void msm_unmask_msi_irq(struct irq_data *data)
{
	struct msi_desc *desc = irq_data_get_msi_desc(data);
	struct pci_dev *pdev;
	struct msm_pcie_dev_t *pcie_dev;
	void __iomem *intr_en_addr;
	uint32_t offset = 0;

	pci_msi_unmask_irq(data);
	pdev = msi_desc_to_pci_dev(desc);
	pcie_dev = PCIE_BUS_PRIV_DATA(pdev->bus);
	offset = data->irq - desc->irq;
	intr_en_addr = pcie_dev->dm_core + PCIE20_MSI_CTRL_INTR_EN;
	msm_pcie_write_mask(intr_en_addr, 0, BIT(offset));
}

static struct irq_chip pcie_msi_chip = {
	.name = "msm-pcie-msi",
	.irq_ack = msm_pcie_msi_nop,
	.irq_enable = unmask_msi_irq,
	.irq_disable = mask_msi_irq,
	.irq_mask = mask_msi_irq,
	.irq_unmask = unmask_msi_irq,
	.irq_enable = msm_unmask_msi_irq,
	.irq_disable = msm_mask_msi_irq,
	.irq_mask = msm_mask_msi_irq,
	.irq_unmask = msm_unmask_msi_irq,
};

static int msm_pcie_create_irq(struct msm_pcie_dev_t *dev)