diff options
Diffstat (limited to 'nand_spl')
| -rw-r--r-- | nand_spl/board/amcc/bamboo/Makefile | 100 | ||||
| -rw-r--r-- | nand_spl/board/amcc/bamboo/config.mk | 49 | ||||
| -rw-r--r-- | nand_spl/board/amcc/bamboo/sdram.c | 92 | ||||
| -rw-r--r-- | nand_spl/board/amcc/bamboo/u-boot.lds | 65 | ||||
| -rw-r--r-- | nand_spl/board/amcc/sequoia/Makefile | 9 | ||||
| -rw-r--r-- | nand_spl/nand_boot.c | 95 | 
6 files changed, 369 insertions, 41 deletions
| diff --git a/nand_spl/board/amcc/bamboo/Makefile b/nand_spl/board/amcc/bamboo/Makefile new file mode 100644 index 000000000..0df86f99d --- /dev/null +++ b/nand_spl/board/amcc/bamboo/Makefile @@ -0,0 +1,100 @@ +# +# (C) Copyright 2007 +# Stefan Roese, DENX Software Engineering, sr@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 $(TOPDIR)/config.mk +include $(TOPDIR)/nand_spl/board/$(BOARDDIR)/config.mk + +LDSCRIPT= $(TOPDIR)/nand_spl/board/$(BOARDDIR)/u-boot.lds +LDFLAGS	= -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS) +AFLAGS	+= -DCONFIG_NAND_SPL +CFLAGS	+= -DCONFIG_NAND_SPL + +SOBJS	= start.o init.o resetvec.o +COBJS	= nand_boot.o nand_ecc.o ndfc.o sdram.o + +SRCS	:= $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c)) +OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS)) +__OBJS	:= $(SOBJS) $(COBJS) +LNDIR	:= $(OBJTREE)/nand_spl/board/$(BOARDDIR) + +nandobj	:= $(OBJTREE)/nand_spl/ + +ALL	= $(nandobj)u-boot-spl $(nandobj)u-boot-spl.bin $(nandobj)u-boot-spl-16k.bin + +all:	$(obj).depend $(ALL) + +$(nandobj)u-boot-spl-16k.bin: $(nandobj)u-boot-spl +	$(OBJCOPY) ${OBJCFLAGS} --pad-to=$(PAD_TO) -O binary $< $@ + +$(nandobj)u-boot-spl.bin:	$(nandobj)u-boot-spl +	$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ + +$(nandobj)u-boot-spl:	$(OBJS) +	cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \ +		-Map $(nandobj)u-boot-spl.map \ +		-o $(nandobj)u-boot-spl + +# create symbolic links for common files + +# from cpu directory +$(obj)ndfc.c: +	@rm -f $(obj)ndfc.c +	ln -s $(SRCTREE)/cpu/ppc4xx/ndfc.c $(obj)ndfc.c + +$(obj)resetvec.S: +	@rm -f $(obj)resetvec.S +	ln -s $(SRCTREE)/cpu/ppc4xx/resetvec.S $(obj)resetvec.S + +$(obj)start.S: +	@rm -f $(obj)start.S +	ln -s $(SRCTREE)/cpu/ppc4xx/start.S $(obj)start.S + +# from board directory +$(obj)init.S: +	@rm -f $(obj)init.S +	ln -s $(SRCTREE)/board/amcc/bamboo/init.S $(obj)init.S + +# from nand_spl directory +$(obj)nand_boot.c: +	@rm -f $(obj)nand_boot.c +	ln -s $(SRCTREE)/nand_spl/nand_boot.c $(obj)nand_boot.c + +# from drivers/nand directory +$(obj)nand_ecc.c: +	@rm -f $(obj)nand_ecc.c +	ln -s $(SRCTREE)/drivers/nand/nand_ecc.c $(obj)nand_ecc.c + +######################################################################### + +$(obj)%.o:	$(obj)%.S +	$(CC) $(AFLAGS) -c -o $@ $< + +$(obj)%.o:	$(obj)%.c +	$(CC) $(CFLAGS) -c -o $@ $< + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/nand_spl/board/amcc/bamboo/config.mk b/nand_spl/board/amcc/bamboo/config.mk new file mode 100644 index 000000000..f7ec7514f --- /dev/null +++ b/nand_spl/board/amcc/bamboo/config.mk @@ -0,0 +1,49 @@ +# +# (C) Copyright 2007 +# Stefan Roese, DENX Software Engineering, sr@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 +# +# +# AMCC 440EP Reference Platform (Bamboo) board +# + +# +# TEXT_BASE for SPL: +# +# On 440EP(x) platforms the SPL is located at 0xfffff000...0xffffffff, +# in the last 4kBytes of memory space in cache. +# We will copy this SPL into instruction-cache in start.S. So we set +# TEXT_BASE to starting address in i-cache here. +# +TEXT_BASE = 0x00800000 + +# PAD_TO used to generate a 16kByte binary needed for the combined image +# -> PAD_TO = TEXT_BASE + 0x4000 +PAD_TO	= 0x00804000 + +PLATFORM_CPPFLAGS += -DCONFIG_440=1 + +ifeq ($(debug),1) +PLATFORM_CPPFLAGS += -DDEBUG +endif + +ifeq ($(dbcr),1) +PLATFORM_CPPFLAGS += -DCFG_INIT_DBCR=0x8cff0000 +endif diff --git a/nand_spl/board/amcc/bamboo/sdram.c b/nand_spl/board/amcc/bamboo/sdram.c new file mode 100644 index 000000000..4f09072df --- /dev/null +++ b/nand_spl/board/amcc/bamboo/sdram.c @@ -0,0 +1,92 @@ +/* + * (C) Copyright 2007 + * Stefan Roese, DENX Software Engineering, sr@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 <common.h> +#include <ppc4xx.h> +#include <asm/processor.h> +#include <asm/io.h> + +static void wait_init_complete(void) +{ +	u32 val; + +	do { +		mfsdram(mem_mcsts, val); +	} while (!(val & 0x80000000)); +} + +/* + * early_sdram_init() + * + * As the name already indicates, this function is called very early + * from start.S and configures the SDRAM with fixed values. This is needed, + * since the 440EP has no internal SRAM and the 4kB NAND_SPL loader has + * not enough free space to implement the complete I2C SPD DDR autodetection + * routines. Therefore the Bamboo only supports the onboard 64MBytes of SDRAM + * when booting from NAND flash. + */ +void early_sdram_init(void) +{ +	/* +	 * Soft-reset SDRAM controller. +	 */ +	mtsdr(sdr_srst, SDR0_SRST_DMC); +	mtsdr(sdr_srst, 0x00000000); + +	/* +	 * Disable memory controller. +	 */ +	mtsdram(mem_cfg0, 0x00000000); + +	/* +	 * Setup some default +	 */ +	mtsdram(mem_uabba, 0x00000000); /* ubba=0 (default)		*/ +	mtsdram(mem_slio, 0x00000000);	/* rdre=0 wrre=0 rarw=0		*/ +	mtsdram(mem_devopt, 0x00000000); /* dll=0 ds=0 (normal)		*/ +	mtsdram(mem_wddctr, 0x00000000); /* wrcp=0 dcd=0		*/ +	mtsdram(mem_clktr, 0x40000000); /* clkp=1 (90 deg wr) dcdt=0	*/ + +	/* +	 * Following for CAS Latency = 2.5 @ 133 MHz PLB +	 */ +	mtsdram(mem_b0cr, 0x00082001); +	mtsdram(mem_tr0, 0x41094012); +	mtsdram(mem_tr1, 0x8080083d);	/* SS=T2 SL=STAGE 3 CD=1 CT=0x00*/ +	mtsdram(mem_rtr, 0x04100000);	/* Interval 7.8µs @ 133MHz PLB	*/ +	mtsdram(mem_cfg1, 0x00000000);	/* Self-refresh exit, disable PM*/ + +	/* +	 * Enable the controller, then wait for DCEN to complete +	 */ +	mtsdram(mem_cfg0, 0x80000000); /* DCEN=1, PMUD=0*/ +	wait_init_complete(); +} + +long int initdram(int board_type) +{ +	/* +	 * Nothing to do here, just return size of fixed SDRAM setup +	 */ +	return CFG_MBYTES_SDRAM << 20; +} diff --git a/nand_spl/board/amcc/bamboo/u-boot.lds b/nand_spl/board/amcc/bamboo/u-boot.lds new file mode 100644 index 000000000..28228f84d --- /dev/null +++ b/nand_spl/board/amcc/bamboo/u-boot.lds @@ -0,0 +1,65 @@ +/* + * (C) Copyright 2007 + * Stefan Roese, DENX Software Engineering, sr@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 + */ + +OUTPUT_ARCH(powerpc:common) +SECTIONS +{ +  .resetvec 0x00800FFC : +  { +    *(.resetvec) +  } = 0xffff + +  .text      : +  { +    start.o	(.text) +    init.o	(.text) +    nand_boot.o	(.text) +    sdram.o	(.text) +    ndfc.o	(.text) + +    *(.text) +    *(.fixup) +  } +  _etext = .; + +  .data    : +  { +    *(.rodata*) +    *(.data*) +    *(.sdata*) +    __got2_start = .; +    *(.got2) +    __got2_end = .; +  } + +  _edata  =  .; + +  __bss_start = .; +  .bss       : +  { +   *(.sbss) +   *(.bss) +  } + +  _end = . ; +} diff --git a/nand_spl/board/amcc/sequoia/Makefile b/nand_spl/board/amcc/sequoia/Makefile index b42da8cf6..ec1be5a76 100644 --- a/nand_spl/board/amcc/sequoia/Makefile +++ b/nand_spl/board/amcc/sequoia/Makefile @@ -1,5 +1,5 @@  # -# (C) Copyright 2006 +# (C) Copyright 2006-2007  # Stefan Roese, DENX Software Engineering, sr@denx.de.  #  # See file CREDITS for list of people who contributed to this @@ -30,7 +30,7 @@ AFLAGS	+= -DCONFIG_NAND_SPL  CFLAGS	+= -DCONFIG_NAND_SPL  SOBJS	= start.o init.o resetvec.o -COBJS	= nand_boot.o ndfc.o sdram.o +COBJS	= nand_boot.o nand_ecc.o ndfc.o sdram.o  SRCS	:= $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))  OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS)) @@ -85,6 +85,11 @@ $(obj)nand_boot.c:  	@rm -f $(obj)nand_boot.c  	ln -s $(SRCTREE)/nand_spl/nand_boot.c $(obj)nand_boot.c +# from drivers/nand directory +$(obj)nand_ecc.c: +	@rm -f $(obj)nand_ecc.c +	ln -s $(SRCTREE)/drivers/nand/nand_ecc.c $(obj)nand_ecc.c +  #########################################################################  $(obj)%.o:	$(obj)%.S diff --git a/nand_spl/nand_boot.c b/nand_spl/nand_boot.c index a136fb707..840a59659 100644 --- a/nand_spl/nand_boot.c +++ b/nand_spl/nand_boot.c @@ -1,5 +1,5 @@  /* - * (C) Copyright 2006 + * (C) Copyright 2006-2007   * Stefan Roese, DENX Software Engineering, sr@denx.de.   *   * This program is free software; you can redistribute it and/or @@ -24,27 +24,28 @@  #define CFG_NAND_READ_DELAY \  	{ volatile int dummy; int i; for (i=0; i<10000; i++) dummy = i; } +static int nand_ecc_pos[] = CFG_NAND_ECCPOS; +  extern void board_nand_init(struct nand_chip *nand); -extern void ndfc_hwcontrol(struct mtd_info *mtdinfo, int cmd); -extern void ndfc_write_byte(struct mtd_info *mtdinfo, u_char byte); -extern u_char ndfc_read_byte(struct mtd_info *mtdinfo); -extern int ndfc_dev_ready(struct mtd_info *mtdinfo); -extern int jump_to_ram(ulong delta); -extern int jump_to_uboot(ulong addr); -static int nand_is_bad_block(struct mtd_info *mtd, int block) +static int nand_command(struct mtd_info *mtd, int block, int page, int offs, u8 cmd)  {  	struct nand_chip *this = mtd->priv; -	int page_addr = block * CFG_NAND_PAGE_COUNT; +	int page_addr = page + block * CFG_NAND_PAGE_COUNT; + +	if (this->dev_ready) +		this->dev_ready(mtd); +	else +		CFG_NAND_READ_DELAY;  	/* Begin command latch cycle */  	this->hwcontrol(mtd, NAND_CTL_SETCLE); -	this->write_byte(mtd, NAND_CMD_READOOB); +	this->write_byte(mtd, cmd);  	/* Set ALE and clear CLE to start address cycle */  	this->hwcontrol(mtd, NAND_CTL_CLRCLE);  	this->hwcontrol(mtd, NAND_CTL_SETALE);  	/* Column address */ -	this->write_byte(mtd, CFG_NAND_BAD_BLOCK_POS);			/* A[7:0] */ +	this->write_byte(mtd, offs);					/* A[7:0] */  	this->write_byte(mtd, (uchar)(page_addr & 0xff));		/* A[16:9] */  	this->write_byte(mtd, (uchar)((page_addr >> 8) & 0xff));	/* A[24:17] */  #ifdef CFG_NAND_4_ADDR_CYCLE @@ -62,6 +63,15 @@ static int nand_is_bad_block(struct mtd_info *mtd, int block)  	else  		CFG_NAND_READ_DELAY; +	return 0; +} + +static int nand_is_bad_block(struct mtd_info *mtd, int block) +{ +	struct nand_chip *this = mtd->priv; + +	nand_command(mtd, block, 0, CFG_NAND_BAD_BLOCK_POS, NAND_CMD_READOOB); +  	/*  	 * Read on byte  	 */ @@ -74,39 +84,46 @@ static int nand_is_bad_block(struct mtd_info *mtd, int block)  static int nand_read_page(struct mtd_info *mtd, int block, int page, uchar *dst)  {  	struct nand_chip *this = mtd->priv; -	int page_addr = page + block * CFG_NAND_PAGE_COUNT; +	u_char *ecc_calc; +	u_char *ecc_code; +	u_char *oob_data;  	int i; +	int eccsize = CFG_NAND_ECCSIZE; +	int eccbytes = CFG_NAND_ECCBYTES; +	int eccsteps = CFG_NAND_ECCSTEPS; +	uint8_t *p = dst; +	int stat; -	/* Begin command latch cycle */ -	this->hwcontrol(mtd, NAND_CTL_SETCLE); -	this->write_byte(mtd, NAND_CMD_READ0); -	/* Set ALE and clear CLE to start address cycle */ -	this->hwcontrol(mtd, NAND_CTL_CLRCLE); -	this->hwcontrol(mtd, NAND_CTL_SETALE); -	/* Column address */ -	this->write_byte(mtd, 0);					/* A[7:0] */ -	this->write_byte(mtd, (uchar)(page_addr & 0xff));		/* A[16:9] */ -	this->write_byte(mtd, (uchar)((page_addr >> 8) & 0xff));	/* A[24:17] */ -#ifdef CFG_NAND_4_ADDR_CYCLE -	/* One more address cycle for devices > 32MiB */ -	this->write_byte(mtd, (uchar)((page_addr >> 16) & 0x0f));	/* A[xx:25] */ -#endif -	/* Latch in address */ -	this->hwcontrol(mtd, NAND_CTL_CLRALE); +	nand_command(mtd, block, page, 0, NAND_CMD_READ0); -	/* -	 * Wait a while for the data to be ready +	/* No malloc available for now, just use some temporary locations +	 * in SDRAM  	 */ -	if (this->dev_ready) -		this->dev_ready(mtd); -	else -		CFG_NAND_READ_DELAY; +	ecc_calc = (u_char *)(CFG_SDRAM_BASE + 0x10000); +	ecc_code = ecc_calc + 0x100; +	oob_data = ecc_calc + 0x200; -	/* -	 * Read page into buffer -	 */ -	for (i=0; i<CFG_NAND_PAGE_SIZE; i++) -		*dst++ = this->read_byte(mtd); +	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) { +		this->enable_hwecc(mtd, NAND_ECC_READ); +		this->read_buf(mtd, p, eccsize); +		this->calculate_ecc(mtd, p, &ecc_calc[i]); +	} +	this->read_buf(mtd, oob_data, CFG_NAND_OOBSIZE); + +	/* Pick the ECC bytes out of the oob data */ +	for (i = 0; i < CFG_NAND_ECCTOTAL; i++) +		ecc_code[i] = oob_data[nand_ecc_pos[i]]; + +	eccsteps = CFG_NAND_ECCSTEPS; +	p = dst; + +	for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) { +		/* No chance to do something with the possible error message +		 * from correct_data(). We just hope that all possible errors +		 * are corrected by this routine. +		 */ +		stat = this->correct_data(mtd, p, &ecc_code[i], &ecc_calc[i]); +	}  	return 0;  } |