Commit 53f67697 authored by Jayachandran C's avatar Jayachandran C Committed by Ralf Baechle

MIPS: MSI: Update MSI handling for XLP

The per-cpu interrupt ACK using EIRR has to be done just once after
all the bits in the status register are processed.

PIC ack has to be done once in case of MSI, and for every interrupt
in case of MSI-X
Signed-off-by: default avatarJayachandran C <jchandra@broadcom.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/8887/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent a3613be4
...@@ -178,13 +178,6 @@ static void xlp_msi_mask_ack(struct irq_data *d) ...@@ -178,13 +178,6 @@ static void xlp_msi_mask_ack(struct irq_data *d)
else else
nlm_write_reg(md->lnkbase, PCIE_MSI_STATUS, 1u << vec); nlm_write_reg(md->lnkbase, PCIE_MSI_STATUS, 1u << vec);
/* Ack at eirr and PIC */
ack_c0_eirr(PIC_PCIE_LINK_MSI_IRQ(link));
if (cpu_is_xlp9xx())
nlm_pic_ack(md->node->picbase,
PIC_9XX_IRT_PCIE_LINK_INDEX(link));
else
nlm_pic_ack(md->node->picbase, PIC_IRT_PCIE_LINK_INDEX(link));
} }
static struct irq_chip xlp_msi_chip = { static struct irq_chip xlp_msi_chip = {
...@@ -230,8 +223,6 @@ static void xlp_msix_mask_ack(struct irq_data *d) ...@@ -230,8 +223,6 @@ static void xlp_msix_mask_ack(struct irq_data *d)
} }
nlm_write_reg(md->lnkbase, status_reg, 1u << bit); nlm_write_reg(md->lnkbase, status_reg, 1u << bit);
/* Ack at eirr and PIC */
ack_c0_eirr(PIC_PCIE_MSIX_IRQ(link));
if (!cpu_is_xlp9xx()) if (!cpu_is_xlp9xx())
nlm_pic_ack(md->node->picbase, nlm_pic_ack(md->node->picbase,
PIC_IRT_PCIE_MSIX_INDEX(msixvec)); PIC_IRT_PCIE_MSIX_INDEX(msixvec));
...@@ -541,6 +532,14 @@ void nlm_dispatch_msi(int node, int lirq) ...@@ -541,6 +532,14 @@ void nlm_dispatch_msi(int node, int lirq)
do_IRQ(irqbase + i); do_IRQ(irqbase + i);
status &= status - 1; status &= status - 1;
} }
/* Ack at eirr and PIC */
ack_c0_eirr(PIC_PCIE_LINK_MSI_IRQ(link));
if (cpu_is_xlp9xx())
nlm_pic_ack(md->node->picbase,
PIC_9XX_IRT_PCIE_LINK_INDEX(link));
else
nlm_pic_ack(md->node->picbase, PIC_IRT_PCIE_LINK_INDEX(link));
} }
void nlm_dispatch_msix(int node, int lirq) void nlm_dispatch_msix(int node, int lirq)
...@@ -567,4 +566,6 @@ void nlm_dispatch_msix(int node, int lirq) ...@@ -567,4 +566,6 @@ void nlm_dispatch_msix(int node, int lirq)
do_IRQ(irqbase + i); do_IRQ(irqbase + i);
status &= status - 1; status &= status - 1;
} }
/* Ack at eirr and PIC */
ack_c0_eirr(PIC_PCIE_MSIX_IRQ(link));
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment