From: John Jacques <john.jacq...@intel.com>

Modified the MSI interrupt handling code to use Level Sensitive IRQ,
while using the PCIe host interrupt line.

Signed-off-by: Palani <palaniappan.ramanat...@intel.com>
Signed-off-by: John Jacques <john.jacq...@intel.com>
---
 drivers/pci/host/pcie-axxia.c | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/host/pcie-axxia.c b/drivers/pci/host/pcie-axxia.c
index 07b6f7b..89f0e88 100644
--- a/drivers/pci/host/pcie-axxia.c
+++ b/drivers/pci/host/pcie-axxia.c
@@ -32,6 +32,8 @@
 
 #include "pcie-axxia.h"
 
+#define AXM_LEVEL_MSI
+
 #ifdef CONFIG_PCI_MSI
 #define AXXIA_GENERIC_MSI_DOMAIN_IRQ 1
 #endif /* CONFIG_PCI_MSI */
@@ -106,8 +108,9 @@
 #define RADM_INTB_ASSERTED              (0x1 << 3)
 #define RADM_INTA_ASSERTED              (0x1 << 2)
 
+#define CC_GPREG_LVL_IRQ_STAT  0x200
 #define CC_GPREG_LVL_IRQ_MASK  0x204
-#define MSI_CNTRL_INT              (0x1 << 9)
+#define MSI_CNTRL_INT           (0x1 << 9)
 
 #define AXI_GPREG_MSTR         0x0
 #define CFG_MSI_MODE           (0x1 << 29)
@@ -841,11 +844,19 @@ static void axxia_pcie_enable_interrupts(struct pcie_port 
*pp)
        if (IS_ENABLED(CONFIG_PCI_MSI)) {
                /* unmask MSI */
                if (pp->num_msi_irqs == 0) {
+#ifdef AXM_LEVEL_MSI
+                       axxia_cc_gpreg_readl(pp,
+                               CC_GPREG_LVL_IRQ_MASK, &val);
+                       val |= MSI_CNTRL_INT;
+                       axxia_cc_gpreg_writel(pp, val,
+                               CC_GPREG_LVL_IRQ_MASK);
+#else
                        axxia_cc_gpreg_readl(pp,
                                CC_GPREG_EDG_IRQ_MASK_HI, &val);
                        val |= MSI_ASSERTED;
                        axxia_cc_gpreg_writel(pp, val,
                                CC_GPREG_EDG_IRQ_MASK_HI);
+#endif
                        axxia_axi_gpreg_readl(pp,
                                AXI_GPREG_EDG_IRQ_MASK_HI, &val);
                        val |= MSIX_ASSERTED;
@@ -1324,16 +1335,27 @@ static irqreturn_t axxia_pcie_irq_handler(int irq, void 
*arg)
        if (IS_ENABLED(CONFIG_PCI_MSI)) {
                if (pp->num_msi_irqs == 0) {
                        offset = irq - pp->msi_irqs[0];
+#ifdef AXM_LEVEL_MSI
+                       axxia_cc_gpreg_readl(pp,
+                               CC_GPREG_LVL_IRQ_STAT, &val);
+                       if (val & MSI_CNTRL_INT) {
+#else
                        axxia_cc_gpreg_readl(pp,
                                CC_GPREG_EDG_IRQ_STAT_HI, &val);
                        if (val & MSI_ASSERTED) {
+#endif
                                axxia_pcie_rd_own_conf(pp,
                                PCIE_MSI_INTR0_STATUS, 4, (u32 *)&val1);
                                if (val1)
                                        ret = axxia_dw_pcie_handle_msi_irq(pp,
                                                                         val1);
+#ifdef AXM_LEVEL_MSI
+                               axxia_cc_gpreg_writel(pp, MSI_CNTRL_INT,
+                                             CC_GPREG_LVL_IRQ_STAT);
+#else
                                axxia_cc_gpreg_writel(pp, MSI_ASSERTED,
                                              CC_GPREG_EDG_IRQ_STAT_HI);
+#endif
                                if (!ret)
                                        return IRQ_NONE;
                        }
-- 
2.7.4

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to