* [PATCH 0/2] ata: Introduce the AHCI_HFLAG_EDGE_IRQ_BROKEN in libahci and enabling it for ahci_xgene driver. [not found] <1452506763-18649-1-git-send-email-stripathi@apm.com> @ 2016-01-11 16:10 ` Tejun Heo [not found] ` <1452506763-18649-2-git-send-email-stripathi@apm.com> 1 sibling, 0 replies; 3+ messages in thread From: Tejun Heo @ 2016-01-11 16:10 UTC (permalink / raw) To: linux-arm-kernel On Mon, Jan 11, 2016 at 03:36:01PM +0530, Suman Tripathi wrote: > This patch set implements a workaround for an errate in the APM > X-Gene SATA host controller with edge interrupt. The HOST_IRQ_STAT > misses the edge interrupt from the PORT_IRQ_STAT when clearing the > HOST_IRQ_STAT and reporting the PORT_IRQ_STAT happens in same clock > cycle. Heh, I don't know why but I had to pull this posting out of spam too. For some reason, gmail thought these are spams. -- tejun ^ permalink raw reply [flat|nested] 3+ messages in thread
[parent not found: <1452506763-18649-2-git-send-email-stripathi@apm.com>]
* [PATCH 1/2] libahci: Implement the workaround to fix the missing of edge interrupt for HOST_IRQ_STAT [not found] ` <1452506763-18649-2-git-send-email-stripathi@apm.com> @ 2016-01-11 16:16 ` Tejun Heo 0 siblings, 0 replies; 3+ messages in thread From: Tejun Heo @ 2016-01-11 16:16 UTC (permalink / raw) To: linux-arm-kernel Hello, On Mon, Jan 11, 2016 at 03:36:02PM +0530, Suman Tripathi wrote: > Due to H/W errata, the HOST_IRQ_STAT register misses the edge interrupt > when clearing the HOST_IRQ_STAT register and hardware reporting the > PORT_IRQ_STAT register at the same clock cycle. As such, the > algorithm below outlines the workaround. > > 1. Read HOST_IRQ_STAT register and save the state. > 2. Clear the HOST_IRQ_STAT register. > 3. Read back the HOST_IRQ_STAT register. > 4. If HOST_IRQ_STAT register equals to zero, then > traverse the rest of port's PORT_IRQ_STAT register > to check if an interrupt is triggered at that point else > go to step 6. > 5. If PORT_IRQ_STAT register of rest ports is not equal to zero > then update the state of HOST_IRQ_STAT saved in step 1. > 6. Handle port interrupts. > 7. Exit ... > +static void ahci_handle_broken_edge_irq(struct ata_host *host, > + u32 *irq_masked) > +{ > + struct ahci_host_priv *hpriv = host->private_data; > + void __iomem *mmio = hpriv->mmio; > + unsigned int i, temp_irq_masked; > + struct ata_port *next_ap; > + void __iomem *port_mmio; > + int j; > + > + if (!readl(mmio + HOST_IRQ_STAT)) { > + temp_irq_masked = *irq_masked; > + > + for (i = 0; i < __sw_hweight32(hpriv->port_map); > + i++) { ^^^^^^ Doesn't this fit on the same line? > + if (*irq_masked & (1 << i)) { > + for (j = 0; > + j < __sw_hweight32(hpriv->port_map); > + j++) { Heh, if (!COND) continue; can be your friend. > + if (i == j) > + continue; > + > + next_ap = host->ports[j]; > + port_mmio = ahci_port_base(next_ap); > + if (readl(port_mmio + PORT_IRQ_STAT)) > + temp_irq_masked |= (1 << j); > + } > + } > + } > + *irq_masked = temp_irq_masked; > + } > + > +} So, this is really specific to the controller. > static u32 ahci_handle_port_intr(struct ata_host *host, u32 irq_masked) > { > + struct ahci_host_priv *hpriv = host->private_data; > unsigned int i, handled = 0; > > + /* > + * For hardware with broken edge trigger latch > + * the HOST_IRQ_STAT register misses the edge interrupt > + * when clearing of HOST_IRQ_STAT register and hardware > + * reporting the PORT_IRQ_STAT register at the > + * same clock cycle. > + */ > + if (hpriv->flags & AHCI_HFLAG_EDGE_IRQ_BROKEN) > + ahci_handle_broken_edge_irq(host, &irq_masked); > + And all it needs is doing some extra processing at the beginning of port interrupt handling. I think it'd be better to implement ahci_xgene specific IRQ handler which does the special processing and call the generic ahci_handle_port_intr(). Thanks. -- tejun ^ permalink raw reply [flat|nested] 3+ messages in thread
[parent not found: <1450942289-12660-1-git-send-email-stripathi@apm.com>]
* [PATCH 0/2] ata: Introduce the AHCI_HFLAG_EDGE_IRQ_BROKEN in libahci and enabling it for ahci_xgene driver. [not found] <1450942289-12660-1-git-send-email-stripathi@apm.com> @ 2016-01-06 13:50 ` Suman Tripathi 0 siblings, 0 replies; 3+ messages in thread From: Suman Tripathi @ 2016-01-06 13:50 UTC (permalink / raw) To: linux-arm-kernel Happy new year !! Any comments on this patchset ? On Thu, Dec 24, 2015 at 1:01 PM, Suman Tripathi <stripathi@apm.com> wrote: > This patch set implements a workaround for an errate in the APM > X-Gene SATA host controller with edge interrupt. The HOST_IRQ_STAT > misses the edge interrupt from the PORT_IRQ_STAT when clearing the > HOST_IRQ_STAT and reporting the PORT_IRQ_STAT happens in same clock > cycle. > > Signed-off-by: Suman Tripathi <stripathi@apm.com> > > Suman Tripathi (2): > libahci: Implement the workaround to fix the missing of edge > interrupt for HOST_IRQ_STAT > ahci_xgene: Enable AHCI_HFLAG_EDGE_IRQ_BROKEN for APM X-Gen2 SATA > host controller > > drivers/ata/ahci.h | 2 ++ > drivers/ata/ahci_xgene.c | 3 ++- > drivers/ata/libahci.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 49 insertions(+), 1 deletions(-) > -- Thanks, with regards, Suman Tripathi ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-01-11 16:16 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <1452506763-18649-1-git-send-email-stripathi@apm.com> 2016-01-11 16:10 ` [PATCH 0/2] ata: Introduce the AHCI_HFLAG_EDGE_IRQ_BROKEN in libahci and enabling it for ahci_xgene driver Tejun Heo [not found] ` <1452506763-18649-2-git-send-email-stripathi@apm.com> 2016-01-11 16:16 ` [PATCH 1/2] libahci: Implement the workaround to fix the missing of edge interrupt for HOST_IRQ_STAT Tejun Heo [not found] <1450942289-12660-1-git-send-email-stripathi@apm.com> 2016-01-06 13:50 ` [PATCH 0/2] ata: Introduce the AHCI_HFLAG_EDGE_IRQ_BROKEN in libahci and enabling it for ahci_xgene driver Suman Tripathi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).