RE: [PATCH v4 4/4] OMAP3: DMA: Errata i541: sDMA FIFO draining does not finish

2010-10-04 Thread G, Manjunath Kondaiah


 -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

2010-10-04 Thread Peter Ujfalusi
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

2010-10-04 Thread G, Manjunath Kondaiah


 -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

2010-10-04 Thread Peter Ujfalusi
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

2010-10-04 Thread Tony Lindgren
* 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