Patch "[PATCH 084/135] ahci: Workaround for ThunderX Errata#22536" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
[PATCH 084/135] ahci: Workaround for ThunderX Errata#22536
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
0084-ahci-Workaround-for-ThunderX-Errata-22536.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
d72f3eed75067a35153ea20b13a471cee5e67c00Mon Sep 17 00:00:00 2001
From: Tirumalesh Chalamarla <[email protected]>
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.
--- drivers/ata/ahci.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+)
drivers/ata/ahci.c +43 -0
@@ -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_devif (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);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/0070-arm64-KVM-Configure-TCR_EL2.PS-at-runtime.patch queue-4.4/0069-irqchip-gic-v3-Make-sure-read-from-ICC_IAR1_EL1-is-v.patch queue-4.4/0084-ahci-Workaround-for-ThunderX-Errata-22536.patch