On May 21, 2009, at 12:10 PM, Peter Tyser wrote: > DMA support is now enabled via the CONFIG_FSL_DMA define instead of > the > previous CONFIG_DDR_ECC > > Signed-off-by: Peter Tyser <pty...@xes-inc.com> > --- > cpu/mpc85xx/cpu.c | 47 ------------------------ > cpu/mpc86xx/cpu.c | 55 ---------------------------- > drivers/dma/Makefile | 1 + > drivers/dma/fsl_dma.c | 92 ++++++++++++++++++++++++++++++++++++++ > +++++++++ > include/configs/PM854.h | 1 + > include/configs/PM856.h | 1 + > 6 files changed, 95 insertions(+), 102 deletions(-) > create mode 100644 drivers/dma/fsl_dma.c
We should add something to include/asm-ppc/config.h to ensure CONFIG_FSL_DMA is set if CONFIG_DDR_ECC is. #if defined(CONFIG_DDR_ECC) && (defined(CONFIG_MPC86xx) || defined(CONFIG_MPC85xx)) #define CONFIG_FSL_DMA #endif - k > > > diff --git a/cpu/mpc85xx/cpu.c b/cpu/mpc85xx/cpu.c > index 86b19a6..416ea08 100644 > --- a/cpu/mpc85xx/cpu.c > +++ b/cpu/mpc85xx/cpu.c > @@ -258,53 +258,6 @@ reset_85xx_watchdog(void) > } > #endif /* CONFIG_WATCHDOG */ > > -#if defined(CONFIG_DDR_ECC) > -void dma_init(void) { > - volatile ccsr_dma_t *dma_base = (void *) > (CONFIG_SYS_MPC85xx_DMA_ADDR); > - volatile fsl_dma_t *dma = &dma_base->dma[0]; > - > - dma->satr = 0x00040000; > - dma->datr = 0x00040000; > - dma->sr = 0xffffffff; /* clear any errors */ > - asm("sync; isync; msync"); > - return; > -} > - > -uint dma_check(void) { > - volatile ccsr_dma_t *dma_base = (void *) > (CONFIG_SYS_MPC85xx_DMA_ADDR); > - volatile fsl_dma_t *dma = &dma_base->dma[0]; > - volatile uint status = dma->sr; > - > - /* While the channel is busy, spin */ > - while((status & 4) == 4) { > - status = dma->sr; > - } > - > - /* clear MR[CS] channel start bit */ > - dma->mr &= 0x00000001; > - asm("sync;isync;msync"); > - > - if (status != 0) { > - printf ("DMA Error: status = %x\n", status); > - } > - return status; > -} > - > -int dma_xfer(void *dest, uint count, void *src) { > - volatile ccsr_dma_t *dma_base = (void *) > (CONFIG_SYS_MPC85xx_DMA_ADDR); > - volatile fsl_dma_t *dma = &dma_base->dma[0]; > - > - dma->dar = (uint) dest; > - dma->sar = (uint) src; > - dma->bcr = count; > - dma->mr = 0xf000004; > - asm("sync;isync;msync"); > - dma->mr = 0xf000005; > - asm("sync;isync;msync"); > - return dma_check(); > -} > -#endif > - > /* > * Configures a UPM. The function requires the respective MxMR to be > set > * before calling this function. "size" is the number or entries, > not a sizeof. > diff --git a/cpu/mpc86xx/cpu.c b/cpu/mpc86xx/cpu.c > index d47cc5e..1f26ba1 100644 > --- a/cpu/mpc86xx/cpu.c > +++ b/cpu/mpc86xx/cpu.c > @@ -177,61 +177,6 @@ watchdog_reset(void) > } > #endif /* CONFIG_WATCHDOG */ > > - > -#if defined(CONFIG_DDR_ECC) > -void > -dma_init(void) > -{ > - volatile ccsr_dma_t *dma_base = (void *) > (CONFIG_SYS_MPC86xx_DMA_ADDR); > - volatile fsl_dma_t *dma = &dma_base->dma[0]; > - > - dma->satr = 0x00040000; > - dma->datr = 0x00040000; > - dma->sr = 0xffffffff; /* clear any errors */ > - asm("sync; isync"); > -} > - > -uint > -dma_check(void) > -{ > - volatile ccsr_dma_t *dma_base = (void *) > (CONFIG_SYS_MPC86xx_DMA_ADDR); > - volatile fsl_dma_t *dma = &dma_base->dma[0]; > - volatile uint status = dma->sr; > - > - /* While the channel is busy, spin */ > - while ((status & 4) == 4) { > - status = dma->sr; > - } > - > - /* clear MR[CS] channel start bit */ > - dma->mr &= 0x00000001; > - asm("sync;isync"); > - > - if (status != 0) { > - printf("DMA Error: status = %x\n", status); > - } > - return status; > -} > - > -int > -dma_xfer(void *dest, uint count, void *src) > -{ > - volatile ccsr_dma_t *dma_base = (void *) > (CONFIG_SYS_MPC86xx_DMA_ADDR); > - volatile fsl_dma_t *dma = &dma_base->dma[0]; > - > - dma->dar = (uint) dest; > - dma->sar = (uint) src; > - dma->bcr = count; > - dma->mr = 0xf000004; > - asm("sync;isync"); > - dma->mr = 0xf000005; > - asm("sync;isync"); > - return dma_check(); > -} > - > -#endif /* CONFIG_DDR_ECC */ > - > - > /* > * Print out the state of various machine registers. > * Currently prints out LAWs, BR0/OR0, and BATs > diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile > index cf29efa..36d99f9 100644 > --- a/drivers/dma/Makefile > +++ b/drivers/dma/Makefile > @@ -26,6 +26,7 @@ include $(TOPDIR)/config.mk > LIB := $(obj)libdma.a > > COBJS-$(CONFIG_FSLDMAFEC) += MCD_tasksInit.o MCD_dmaApi.o MCD_tasks.o > +COBJS-$(CONFIG_FSL_DMA) += fsl_dma.o > > COBJS := $(COBJS-y) > SRCS := $(COBJS:.o=.c) > diff --git a/drivers/dma/fsl_dma.c b/drivers/dma/fsl_dma.c > new file mode 100644 > index 0000000..a9989ee > --- /dev/null > +++ b/drivers/dma/fsl_dma.c > @@ -0,0 +1,92 @@ > +/* > + * Copyright 2004,2007,2008 Freescale Semiconductor, Inc. > + * (C) Copyright 2002, 2003 Motorola Inc. > + * Xianghua Xiao (x.x...@motorola.com) > + * > + * (C) Copyright 2000 > + * Wolfgang Denk, DENX Software Engineering, w...@denx.de. > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > + * MA 02111-1307 USA > + */ > + > +#include <config.h> > +#include <common.h> > +#include <asm/fsl_dma.h> > + > +#if defined(CONFIG_MPC85xx) > +volatile ccsr_dma_t *dma_base = (void *) > (CONFIG_SYS_MPC85xx_DMA_ADDR); > +#elif defined(CONFIG_MPC86xx) > +volatile ccsr_dma_t *dma_base = (void *) > (CONFIG_SYS_MPC86xx_DMA_ADDR); > +#else > +#error "Freescale DMA engine not supported on your processor" > +#endif > + > +static void dma_sync(void) > +{ > +#if defined(CONFIG_MPC85xx) > + asm("sync; isync; msync"); > +#elif defined(CONFIG_MPC86xx) > + asm("sync; isync"); > +#endif > +} > + > +static uint dma_check(void) { > + volatile fsl_dma_t *dma = &dma_base->dma[0]; > + volatile uint status = dma->sr; > + > + /* While the channel is busy, spin */ > + while (status & 4) > + status = dma->sr; > + > + /* clear MR[CS] channel start bit */ > + dma->mr &= 1; > + dma_sync(); > + > + if (status != 0) > + printf ("DMA Error: status = %x\n", status); > + > + return status; > +} > + > +void dma_init(void) { > + volatile fsl_dma_t *dma = &dma_base->dma[0]; > + > + dma->satr = 0x00040000; > + dma->datr = 0x00040000; > + dma->sr = 0xffffffff; /* clear any errors */ > + dma_sync(); > +} > + > +int dma_xfer(void *dest, uint count, void *src) { > + volatile fsl_dma_t *dma = &dma_base->dma[0]; > + > + dma->dar = (uint) dest; > + dma->sar = (uint) src; > + dma->bcr = count; > + > + /* Disable bandwidth control, use direct transfer mode */ > + dma->mr = 0xf000004; > + dma_sync(); > + > + /* Start the transfer */ > + dma->mr = 0xf000005; > + dma_sync(); > + > + return dma_check(); > +} > diff --git a/include/configs/PM854.h b/include/configs/PM854.h > index 3f943aa..4b9bcca 100644 > --- a/include/configs/PM854.h > +++ b/include/configs/PM854.h > @@ -96,6 +96,7 @@ > #undef CONFIG_DDR_SPD > #define CONFIG_DDR_DLL /* possible DLL fix > needed */ > #define CONFIG_DDR_ECC /* only for ECC DDR module > */ > +#define CONFIG_FSL_DMA /* use DMA to init DDR ECC > */ > > #define CONFIG_MEM_INIT_VALUE 0xDeadBeef > > diff --git a/include/configs/PM856.h b/include/configs/PM856.h > index 43c2873..1db20bc 100644 > --- a/include/configs/PM856.h > +++ b/include/configs/PM856.h > @@ -98,6 +98,7 @@ > #undef CONFIG_DDR_SPD > #define CONFIG_DDR_DLL /* possible DLL fix > needed */ > #define CONFIG_DDR_ECC /* only for ECC DDR module > */ > +#define CONFIG_FSL_DMA /* use DMA to init DDR ECC > */ > > #define CONFIG_MEM_INIT_VALUE 0xDeadBeef > > -- > 1.6.2.1 > > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot