+++ /dev/null
-From d72f3eed75067a35153ea20b13a471cee5e67c00 Mon Sep 17 00:00:00 2001
-From: Tirumalesh Chalamarla <tchalamarla@caviumnetworks.com>
-Date: Tue, 16 Feb 2016 12:08:49 -0800
-Subject: [PATCH 084/135] ahci: Workaround for ThunderX Errata#22536
-
-[ Upstream commit d243bed32f5042582896237f88fa1798aee55ff9 ]
-
-Due to Errata in ThunderX, HOST_IRQ_STAT should be
-cleared before leaving the interrupt handler.
-The patch attempts to satisfy the need.
-
-Changes from V2:
- - removed newfile
- - code is now under CONFIG_ARM64
-
-Changes from V1:
- - Rebased on top of libata/for-4.6
- - Moved ThunderX intr handler to new file
-
-tj: Minor adjustments to comments.
-
-Signed-off-by: Tirumalesh Chalamarla <tchalamarla@caviumnetworks.com>
-Signed-off-by: Tejun Heo <tj@kernel.org>
-Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/ata/ahci.c | 43 +++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 43 insertions(+)
-
---- a/drivers/ata/ahci.c
-+++ b/drivers/ata/ahci.c
-@@ -1331,6 +1331,44 @@ static inline void ahci_gtf_filter_worka
- {}
- #endif
-
-+#ifdef CONFIG_ARM64
-+/*
-+ * Due to ERRATA#22536, ThunderX needs to handle HOST_IRQ_STAT differently.
-+ * Workaround is to make sure all pending IRQs are served before leaving
-+ * handler.
-+ */
-+static irqreturn_t ahci_thunderx_irq_handler(int irq, void *dev_instance)
-+{
-+ struct ata_host *host = dev_instance;
-+ struct ahci_host_priv *hpriv;
-+ unsigned int rc = 0;
-+ void __iomem *mmio;
-+ u32 irq_stat, irq_masked;
-+ unsigned int handled = 1;
-+
-+ VPRINTK("ENTER\n");
-+ hpriv = host->private_data;
-+ mmio = hpriv->mmio;
-+ irq_stat = readl(mmio + HOST_IRQ_STAT);
-+ if (!irq_stat)
-+ return IRQ_NONE;
-+
-+ do {
-+ irq_masked = irq_stat & hpriv->port_map;
-+ spin_lock(&host->lock);
-+ rc = ahci_handle_port_intr(host, irq_masked);
-+ if (!rc)
-+ handled = 0;
-+ writel(irq_stat, mmio + HOST_IRQ_STAT);
-+ irq_stat = readl(mmio + HOST_IRQ_STAT);
-+ spin_unlock(&host->lock);
-+ } while (irq_stat);
-+ VPRINTK("EXIT\n");
-+
-+ return IRQ_RETVAL(handled);
-+}
-+#endif
-+
- /*
- * ahci_init_msix() only implements single MSI-X support, not multiple
- * MSI-X per-port interrupts. This is needed for host controllers that only
-@@ -1546,6 +1584,11 @@ static int ahci_init_one(struct pci_dev
- if (ahci_broken_devslp(pdev))
- hpriv->flags |= AHCI_HFLAG_NO_DEVSLP;
-
-+#ifdef CONFIG_ARM64
-+ if (pdev->vendor == 0x177d && pdev->device == 0xa01c)
-+ hpriv->irq_handler = ahci_thunderx_irq_handler;
-+#endif
-+
- /* save initial config */
- ahci_pci_save_initial_config(pdev, hpriv);
-