[U-Boot] [PATCH 0/3] DMA ECC update

Ira W. Snyder iws at ovro.caltech.edu
Thu Jul 9 01:13:06 CEST 2009


On Wed, Jul 08, 2009 at 05:59:33PM -0500, Peter Tyser wrote:
> On Wed, 2009-07-08 at 15:31 -0700, Ira W. Snyder wrote:
> > On Wed, Jul 08, 2009 at 02:28:39PM -0500, Peter Tyser wrote:
> > > These changes bring the 83xx SDRAM ECC initialization in line
> > > with the 85xx/86xx boards and also fixes a minor bug in fsl_dma.c.
> > > 
> > > I don't have any 83xx boards to test on, so it would be appreciated
> > > if someone with 83xx hardware that uses ECC could give the patches
> > > a shot.
> > > 
> > > It'd be nice if SDRAM could be initialized via the DDR controller
> > > with CONFIG_ECC_INIT_VIA_DDRCONTROLLER on the 83xx platform too,
> > > but I'm not going to tackle it:)
> > > 
> > > The patches also resolve the compile error Stefan brought up with
> > > non-freescale boards with CONFIG_ECC.
> > > 
> > > Peter Tyser (3):
> > >   83xx: Default to using DMA to initialize SDRAM
> > >   83xx: Added CONFIG_MEM_INIT_VALUE for boards with ECC
> > >   fsl_dma: Fix SDRAM initial value
> > > 
> > 
> > Something in this patch makes the ECC DDR initialization VERY slow. It
> > used to take <5 seconds, now it takes ~20 seconds for the memory to
> > initialize.
> > 
> > I wonder why the CPU method would be so much faster?
> > 
> > Other than the speed, I can confirm that it works as expected on my
> > 8349emds-based board. I see no reason why there would be a problem on
> > the mpc8349emds, though I cannot test on the eval board itself. I do not
> > have an ECC SDRAM module.
> 
> Thanks for testing Ira.  The original code had the instruction cache
> enabled during SDRAM init, but it'd be pretty amazing if it gave that
> much performance boost.  I would have guessed that the DMA init would
> have been faster even without the icache enabled.
> 
> If you have a second, could you try adding this patch on top of the
> previous ones?  It'd be interesting to see where the bottleneck is with
> and without the icache...
> 

It didn't apply cleanly (I'm not sure why), but I applied it (fixed the
missing semicolon).

It makes the DMA initialization normal speed again. The DMA in the for
loop takes the longest (as expected).

So yes, strangely it makes a HUGE difference. The total time is <3
seconds now. It is now faster than the previous CPU method.

Ira

> Thanks,
> Peter
> 
> 
> diff --git a/drivers/dma/fsl_dma.c b/drivers/dma/fsl_dma.c
> index f07b25c..24b31c7 100644
> --- a/drivers/dma/fsl_dma.c
> +++ b/drivers/dma/fsl_dma.c
> @@ -148,6 +148,8 @@ void dma_meminit(uint val, uint size)
>         uint *p = 0;
>         uint i = 0;
>  
> +icache_enable()
> +printf("%d\n", __LINE__);
>         for (*p = 0; p < (uint *)(8 * 1024); p++) {
>                 if (((uint)p & 0x1f) == 0)
>                         ppcDcbz((ulong)p);
> @@ -157,6 +159,7 @@ void dma_meminit(uint val, uint size)
>                 if (((uint)p & 0x1c) == 0x1c)
>                         ppcDcbf((ulong)p);
>         }
> +printf("%d\n", __LINE__);
>  
>         dmacpy(0x002000, 0, 0x002000); /* 8K */
>         dmacpy(0x004000, 0, 0x004000); /* 16K */
> @@ -169,7 +172,10 @@ void dma_meminit(uint val, uint size)
>         dmacpy(0x200000, 0, 0x200000); /* 2M */
>         dmacpy(0x400000, 0, 0x400000); /* 4M */
>  
> +printf("%d\n", __LINE__);
>         for (i = 1; i < size / 0x800000; i++)
>                 dmacpy((0x800000 * i), 0, 0x800000);
> +printf("%d\n", __LINE__);
> +icache_disable();
>  }
>  #endif
> 
> 


More information about the U-Boot mailing list