RE: [PATCH v4 4/4] OMAP3: DMA: Errata i541: sDMA FIFO draining does not finish
-Original Message- From: Peter Ujfalusi [mailto:peter.ujfal...@nokia.com] Sent: Monday, October 04, 2010 4:13 PM To: G, Manjunath Kondaiah Cc: Tony Lindgren; linux-omap@vger.kernel.org; Jarkko Nikula; linux-arm-ker...@lists.infradead.org Subject: Re: [PATCH v4 4/4] OMAP3: DMA: Errata i541: sDMA FIFO draining does not finish On Monday 04 October 2010 12:17:41 ext G, Manjunath Kondaiah wrote: ... + /* OMAP3 Errata i541: sDMA FIFO draining does not finish */ This logic is required for multiple erratas. As Tony requested, I have added a variable for flags to handle the different erratas. I even added a macro to check that the errata applies, so one can use: if (IS_DMA_ERRATA(DMA_ERRATA_X)) Can we have seperate function for handling this logic. More details at: https://patchwork.kernel.org/patch/126271/ I see. That patch is for hwmod converted dma code, right? We need this fix without the hwmod to applied, and than backport it to earlier kernel releases. As I mentioned in other mail, if you are introducing this feature, it is better to convert existing erratas also to use this feature. The upcoming hwmod conversion will take care of the cleanup. If this is the case, not sure about intention of having dma_errata only for these two erratas since all the erratas are not handled. All the erratas will get cleaned up and errata handling feature will be introduced along with dma hwmod changes. If feel v3 version is better so that I can use these changes along dma hwmod. It is upto Tony to decide. We _need_ these two small fixes ASAP, since it is fixing serious problem in audio (and the same issue might bite other areas as well). It is not the intention of this series to clean up the arc/arm/plat-omap/dma.c. Tony, How about having v3 series + review comments fixed(except comments related errata handling). Errata handling will be done as part dma hwmod. I am waiting for these patches so that I can rebase these patches in DMA hwmod. -Manjunath-- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 4/4] OMAP3: DMA: Errata i541: sDMA FIFO draining does not finish
On Monday 04 October 2010 12:17:41 ext G, Manjunath Kondaiah wrote: ... + /* OMAP3 Errata i541: sDMA FIFO draining does not finish */ This logic is required for multiple erratas. As Tony requested, I have added a variable for flags to handle the different erratas. I even added a macro to check that the errata applies, so one can use: if (IS_DMA_ERRATA(DMA_ERRATA_X)) Can we have seperate function for handling this logic. More details at: https://patchwork.kernel.org/patch/126271/ I see. That patch is for hwmod converted dma code, right? We need this fix without the hwmod to applied, and than backport it to earlier kernel releases. As I mentioned in other mail, if you are introducing this feature, it is better to convert existing erratas also to use this feature. The upcoming hwmod conversion will take care of the cleanup. We _need_ these two small fixes ASAP, since it is fixing serious problem in audio (and the same issue might bite other areas as well). It is not the intention of this series to clean up the arc/arm/plat-omap/dma.c. I have added the dma_errata variable, since Tony asked for it, but even that addition is a bigger change than what I was planning to do here. -- Péter -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH v4 4/4] OMAP3: DMA: Errata i541: sDMA FIFO draining does not finish
-Original Message- From: linux-omap-ow...@vger.kernel.org [mailto:linux-omap-ow...@vger.kernel.org] On Behalf Of Peter Ujfalusi Sent: Monday, October 04, 2010 1:48 PM To: Tony Lindgren Cc: linux-omap@vger.kernel.org; Jarkko Nikula; linux-arm-ker...@lists.infradead.org Subject: [PATCH v4 4/4] OMAP3: DMA: Errata i541: sDMA FIFO draining does not finish ... + /* OMAP3 Errata i541: sDMA FIFO draining does not finish */ This logic is required for multiple erratas. Can we have seperate function for handling this logic. More details at: https://patchwork.kernel.org/patch/126271/ ... --- a/arch/arm/plat-omap/include/plat/dma.h +++ b/arch/arm/plat-omap/include/plat/dma.h @@ -335,6 +335,9 @@ #define OMAP2_DMA_MISALIGNED_ERR_IRQ (1 11) #define OMAP_DMA_CCR_EN (1 7) +#define OMAP_DMA_CCR_RD_ACTIVE (1 9) +#define OMAP_DMA_CCR_WR_ACTIVE (1 10) +#define OMAP_DMA_CCR_SEL_SRC_DST_SYNC(1 24) #define OMAP_DMA_CCR_BUFFERING_DISABLE (1 25) As I mentioned in other mail, if you are introducing this feature, it is better to convert existing erratas also to use this feature. -Manjunath-- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v4 4/4] OMAP3: DMA: Errata i541: sDMA FIFO draining does not finish
Implement the suggested workaround for OMAP3 regarding to sDMA draining issue, when the channel is disabled on the fly. This errata affects the following configuration: sDMA transfer is source synchronized Buffering is enabled SmartStandby is selected. The issue can be easily reproduced by creating overrun situation while recording audio. Either introduce load to the CPU: nice -19 arecord -D hw:0 -M -B 1 -F 5000 -f dat /dev/null \ dd if=/dev/urandom of=/dev/null or suspending the arecord, and resuming it: arecord -D hw:0 -M -B 1 -F 5000 -f dat /dev/null CTRL+Z; fg; CTRL+Z; fg; ... In case of overrun audio stops DMA, and restarts it (without reseting the sDMA channel). When we hit this errata in stop case (sDMA drain did not complete), at the coming start the sDMA will not going to be operational (it is still draining). This leads to DMA stall condition. On OMAP3 we can recover with sDMA channel reset, it has been observed that by introducing unrelated sDMA activity might also help (reading from MMC for example). The same errata exists for OMAP2, where the suggestion is to disable the buffering to avoid this type of error. On OMAP3 the suggestion is to set sDMA to NoStandby before disabling the channel, and wait for the drain to finish, than configure sDMA to SmartStandby again. Signed-off-by: Peter Ujfalusi peter.ujfal...@nokia.com Acked-by: Jarkko Nikula jhnik...@gmail.com Acked-by : Santosh Shilimkar santosh.shilim...@ti.com Acked-by : G, Manjunath Kondaiah manj...@ti.com --- arch/arm/plat-omap/dma.c | 42 +++- arch/arm/plat-omap/include/plat/dma.h |3 ++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index c116c41..a102cf5 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c @@ -30,6 +30,7 @@ #include linux/irq.h #include linux/io.h #include linux/slab.h +#include linux/delay.h #include asm/system.h #include mach/hardware.h @@ -148,6 +149,8 @@ static const u8 omap1_dma_irq[OMAP1_LOGICAL_DMA_CH_COUNT] = { /* Errata handling */ #define DMA_ERRATA_IFRAME_BUFFERING(1 0) +/* OMAP3 Errata i541: sDMA FIFO draining does not finish */ +#define DMA_ERRATA_i541(1 1) static u16 dma_errata; #define IS_DMA_ERRATA(id) (dma_errata (id)) @@ -1023,8 +1026,40 @@ void omap_stop_dma(int lch) dma_write(0, CICR(lch)); l = dma_read(CCR(lch)); - l = ~OMAP_DMA_CCR_EN; - dma_write(l, CCR(lch)); + /* OMAP3 Errata i541: sDMA FIFO draining does not finish */ + if (IS_DMA_ERRATA(DMA_ERRATA_i541) + (l OMAP_DMA_CCR_SEL_SRC_DST_SYNC)) { + int i = 0; + u32 sys_cf; + + /* Configure No-Standby */ + l = dma_read(OCP_SYSCONFIG); + sys_cf = l; + l = ~DMA_SYSCONFIG_MIDLEMODE_MASK; + l |= DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_NO_IDLE); + dma_write(l , OCP_SYSCONFIG); + + l = dma_read(CCR(lch)); + l = ~OMAP_DMA_CCR_EN; + dma_write(l, CCR(lch)); + + /* Wait for sDMA FIFO drain */ + l = dma_read(CCR(lch)); + while (i 100 (l (OMAP_DMA_CCR_RD_ACTIVE | + OMAP_DMA_CCR_WR_ACTIVE))) { + udelay(5); + i++; + l = dma_read(CCR(lch)); + } + if (i = 100) + printk(KERN_ERR DMA drain did not complete on + lch %d\n, lch); + /* Restore OCP_SYSCONFIG */ + dma_write(sys_cf, OCP_SYSCONFIG); + } else { + l = ~OMAP_DMA_CCR_EN; + dma_write(l, CCR(lch)); + } if (!omap_dma_in_1510_mode() dma_chan[lch].next_lch != -1) { int next_lch, cur_lch = lch; @@ -2051,6 +2086,9 @@ static void dma_errata_configure(void) if (cpu_is_omap2420() || (cpu_is_omap2430() (omap_type() == OMAP2430_REV_ES1_0))) dma_errata |= DMA_ERRATA_IFRAME_BUFFERING; + + if (cpu_is_omap34xx()) + dma_errata |= DMA_ERRATA_i541; } static int __init omap_init_dma(void) diff --git a/arch/arm/plat-omap/include/plat/dma.h b/arch/arm/plat-omap/include/plat/dma.h index 776ba44..cf66f85 100644 --- a/arch/arm/plat-omap/include/plat/dma.h +++ b/arch/arm/plat-omap/include/plat/dma.h @@ -335,6 +335,9 @@ #define OMAP2_DMA_MISALIGNED_ERR_IRQ (1 11) #define OMAP_DMA_CCR_EN(1 7) +#define OMAP_DMA_CCR_RD_ACTIVE (1 9) +#define OMAP_DMA_CCR_WR_ACTIVE (1 10) +#define OMAP_DMA_CCR_SEL_SRC_DST_SYNC (1 24) #define OMAP_DMA_CCR_BUFFERING_DISABLE (1 25) #define OMAP_DMA_DATA_TYPE_S8 0x00 -- 1.7.3 -- To unsubscribe from this list: send the line unsubscribe linux-omap in
Re: [PATCH v4 4/4] OMAP3: DMA: Errata i541: sDMA FIFO draining does not finish
* Peter Ujfalusi peter.ujfal...@nokia.com [101004 03:33]: On Monday 04 October 2010 12:17:41 ext G, Manjunath Kondaiah wrote: ... + /* OMAP3 Errata i541: sDMA FIFO draining does not finish */ This logic is required for multiple erratas. As Tony requested, I have added a variable for flags to handle the different erratas. I even added a macro to check that the errata applies, so one can use: if (IS_DMA_ERRATA(DMA_ERRATA_X)) Can we have seperate function for handling this logic. More details at: https://patchwork.kernel.org/patch/126271/ I see. That patch is for hwmod converted dma code, right? We need this fix without the hwmod to applied, and than backport it to earlier kernel releases. As I mentioned in other mail, if you are introducing this feature, it is better to convert existing erratas also to use this feature. The upcoming hwmod conversion will take care of the cleanup. We _need_ these two small fixes ASAP, since it is fixing serious problem in audio (and the same issue might bite other areas as well). It is not the intention of this series to clean up the arc/arm/plat-omap/dma.c. I have added the dma_errata variable, since Tony asked for it, but even that addition is a bigger change than what I was planning to do here. Yeah.. Let's just use your original patch for the fix, then queue adding the errata flag for the upcoming merge window. Regards, Tony -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html