Flex-OneNAND booting support
Subsystems (2)
PATCH 1/1 Flex-OneNAND booting support
Flex-OneNAND booting support
Flex-OneNAND is a monolithic integrated circuit with a NAND Flash array using a NOR Flash interface. This on-chip integration enables system designers to reduce external system logic and use high-density NAND Flash in applications that would otherwise have to use more NOR components.
Flex-OneNAND enables users to configure to partition it into SLC and MLC areas in more flexible way. While MLC area of Flex-OneNAND can be used to store data that require low reliability and high density, SLC area of Flex-OneNAND to store data that need high reliability and high performance. Flex-OneNAND can let users take advantage of storing these two different types of data into one chip, which is making Flex-OneNAND more cost- and space-effective.
---
Makefile +6 -2
@@ -333,10 +333,12 @@ $(U_BOOT_NAND): $(NAND_SPL) $(obj)u-boot.bin $(obj)include/autoconf.mk cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin $(ONENAND_IPL): $(VERSION_FILE) $(obj)include/autoconf.mk - $(MAKE) -C onenand_ipl/board/$(BOARDDIR) all + $(MAKE) -C $(obj)onenand_ipl/board/$(BOARDDIR) all $(U_BOOT_ONENAND): $(ONENAND_IPL) $(obj)u-boot.bin $(obj)include/autoconf.mk + $(MAKE) -C $(obj)onenand_ipl/board/$(BOARDDIR) all cat $(obj)onenand_ipl/onenand-ipl-2k.bin $(obj)u-boot.bin > $(obj)u-boot-onenand.bin + cat $(obj)onenand_ipl/onenand-ipl-4k.bin $(obj)u-boot.bin > $(obj)u-boot-flexonenand.bin $(VERSION_FILE): @( echo -n "#define U_BOOT_VERSION \"U-Boot " ; \
@@ -2914,7 +2916,9 @@ clean: @rm -f $(obj)include/bmp_logo.h @rm -f $(obj)nand_spl/u-boot-spl $(obj)nand_spl/u-boot-spl.map @rm -f $(obj)onenand_ipl/onenand-ipl $(obj)onenand_ipl/onenand-ipl.bin \ - $(obj)onenand_ipl/onenand-ipl-2k.bin $(obj)onenand_ipl/onenand-ipl.map + $(obj)onenand_ipl/onenand-ipl-2k.bin \ + $(obj)onenand_ipl/onenand-ipl-4k.bin \ + $(obj)onenand_ipl/onenand-ipl.map @rm -f $(obj)api_examples/demo $(VERSION_FILE) clobber: clean
drivers/mtd/onenand/onenand_base.c +6 -0
@@ -1180,6 +1180,12 @@ static int onenand_probe(struct mtd_info *mtd)if (maf_id != bram_maf_id || dev_id != bram_dev_id)return -ENXIO ; +/* FIXME : Current OneNAND MTD doesn't support Flex-OneNAND */ +if (dev_id & (1 <<9 )) { +printk ("Not yet support Flex-OneNAND\n" ); +return -ENXIO ; + } +/* Flash device information */ onenand_print_device_info (dev_id,0 ); this->device_id = dev_id;
onenand_ipl/board/apollon/Makefile +5 -2
@@ -9,7 +9,7 @@ AFLAGS += -DCONFIG_ONENAND_IPL CFLAGS += -DCONFIG_ONENAND_IPL OBJCLFAGS += --gap-fill=0x00 -SOBJS = start.o low_levelinit.o # _memcpy32.o +SOBJS = start.o low_levelinit.o COBJS = apollon.o onenand_read.o onenand_boot.o SRCS := $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
@@ -19,13 +19,16 @@ LNDIR := $(OBJTREE)/onenand_ipl/board/$(BOARDDIR) onenandobj := $(OBJTREE)/onenand_ipl/ -ALL = $(onenandobj)onenand-ipl $(onenandobj)onenand-ipl.bin $(onenandobj)onenand-ipl-2k.bin +ALL = $(onenandobj)onenand-ipl $(onenandobj)onenand-ipl.bin $(onenandobj)onenand-ipl-2k.bin $(onenandobj)onenand-ipl-4k.bin all: $(obj).depend $(ALL) $(onenandobj)onenand-ipl-2k.bin: $(onenandobj)onenand-ipl $(OBJCOPY) ${OBJCFLAGS} --pad-to=0x800 -O binary $< $@ +$(onenandobj)onenand-ipl-4k.bin: $(onenandobj)onenand-ipl + $(OBJCOPY) ${OBJCFLAGS} --pad-to=0x1000 -O binary $< $@ + $(onenandobj)onenand-ipl.bin: $(onenandobj)onenand-ipl $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
onenand_ipl/board/apollon/low_levelinit.S +0 -0
onenand_ipl/onenand_boot.c +1 -1
@@ -60,7 +60,7 @@ void start_oneboot(void) buf = (uchar *)CFG_LOAD_ADDR ; -if (!onenand_read_block (buf,ONENAND_START_BLOCK )) +if (!onenand_read_block0 (buf)) buf +=ONENAND_BLOCK_SIZE ;if (buf == (uchar *)CFG_LOAD_ADDR )
onenand_ipl/onenand_ipl.h +1 -2
@@ -23,7 +23,6 @@#include <linux/mtd/onenand_regs.h> -#define ONENAND_START_BLOCK 0#define ONENAND_BLOCK_SIZE 2048#ifndef CFG_PRINTF
@@ -40,5 +39,5 @@#define ONENAND_PAGE_SIZE 2048 -extern int onenand_read_block (unsigned char *buf,ulong block); +extern int onenand_read_block0 (unsigned char *buf);#endif
onenand_ipl/onenand_read.c +18 -10
@@ -33,8 +33,12 @@#define onenand_buffer_address () ((1 << 3) << 8)#define onenand_bufferram_address (block) (0) +#ifdef __HAVE_ARCH_MEMCPY32 +extern void *memcpy32 (void *dest,void *src,int size); +#endif +/* read a page with ECC */ -static inline int onenand_read_page (ulong block,ulong page,u_char *buf) +static inline int onenand_read_page (ulong block,ulong page,u_char *buf,int pagesize) {unsigned long *base;
@@ -46,15 +50,15 @@ static inline int onenand_read_page(ulong block, ulong page, u_char *buf)onenand_writew (onenand_block_address (block),THIS_ONENAND (ONENAND_REG_START_ADDRESS1 )); +onenand_writew (onenand_bufferram_address (block), +THIS_ONENAND (ONENAND_REG_START_ADDRESS2 )); +onenand_writew (onenand_sector_address (page),THIS_ONENAND (ONENAND_REG_START_ADDRESS8 ));onenand_writew (onenand_buffer_address (),THIS_ONENAND (ONENAND_REG_START_BUFFER )); -onenand_writew (onenand_bufferram_address (block), -THIS_ONENAND (ONENAND_REG_START_ADDRESS2 )); -onenand_writew (ONENAND_INT_CLEAR ,THIS_ONENAND (ONENAND_REG_INTERRUPT ));onenand_writew (ONENAND_CMD_READ ,THIS_ONENAND (ONENAND_REG_COMMAND ));
@@ -69,9 +73,9 @@ static inline int onenand_read_page(ulong block, ulong page, u_char *buf)#ifdef __HAVE_ARCH_MEMCPY32/* 32 bytes boundary memory copy */ -memcpy32 (buf, base,ONENAND_PAGE_SIZE ); +memcpy32 (buf, base, pagesize);#else -for (offset =0 ; offset < (ONENAND_PAGE_SIZE >>2 ); offset++) { +for (offset =0 ; offset < (pagesize >>2 ); offset++) { value = *(base + offset); *p++ = value; }
@@ -87,18 +91,22 @@ static inline int onenand_read_page(ulong block, ulong page, u_char *buf)* onenand_read_block - Read a block data to buf * @return 0 on success */ -int onenand_read_block (unsigned char *buf,ulong block) +int onenand_read_block0 (unsigned char *buf) {int page, offset =0 ; +int pagesize =ONENAND_PAGE_SIZE ; + +/* MLC OneNAND has 4KiB page size */ +if (onenand_readw (THIS_ONENAND (ONENAND_REG_TECHNOLOGY ))) + pagesize <<=1 ;/* NOTE: you must read page from page 1 of block 0 */ /* read the block page by page*/ for (page =ONENAND_START_PAGE ; page <ONENAND_PAGES_PER_BLOCK ; page++) { -onenand_read_page (block, page, buf + offset); - - offset +=ONENAND_PAGE_SIZE ; +onenand_read_page (0 , page, buf + offset, pagesize); + offset += pagesize; }return 0 ;
PATCH 1/1 Flex-OneNAND booting support
Quoted 6 lines · In message <20080218075519.GA5052@party> you wrote:
Flex-OneNAND booting support
Flex-OneNAND is a monolithic integrated circuit with a NAND Flash array using a NOR Flash interface. This on-chip integration enables system designers to reduce external system logic and use high-density NAND Flash in applications that would otherwise h ave to use more NOR components.
Flex-OneNAND enables users to configure to partition it into SLC and MLC areas in more flexible way. While MLC area of Flex-OneNAND can be used to store data that require low reliability and high density, SLC area of Flex-OneNAND to store data that need
high reliability and high performance. Flex-OneNAND can let users take advantage of storing these two different types of data into one chip, which is making Flex-OneNAND more cost- and space-effective.
Please make sure the line lengt is 70 characters maximum or so.
Quoted 19 lines
Makefile +3
-1@@ -333,10 +333,12 @@ $(U_BOOT_NAND): $(NAND_SPL) $(obj)u-boot.bin $(obj)include/autoconf.mk cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin $(ONENAND_IPL): $(VERSION_FILE) $(obj)include/autoconf.mk - $(MAKE) -C onenand_ipl/board/$(BOARDDIR) all + $(MAKE) -C $(obj)onenand_ipl/board/$(BOARDDIR) all $(U_BOOT_ONENAND): $(ONENAND_IPL) $(obj)u-boot.bin $(obj)include/autoconf.mk + $(MAKE) -C $(obj)onenand_ipl/board/$(BOARDDIR) all cat $(obj)onenand_ipl/onenand-ipl-2k.bin $(obj)u-boot.bin > $(obj)u-boot-onenand.bin + cat $(obj)onenand_ipl/onenand-ipl-4k.bin $(obj)u-boot.bin > $(obj)u-boot-flexonenand.bin $(VERSION_FILE): @( echo -n "#define U_BOOT_VERSION \"U-Boot " ; \
Makefile clean: · line 2922
Quoted 8 lines
Makefile +3
-1@@ -2914,7 +2916,9 @@ clean: @rm -f $(obj)include/bmp_logo.h @rm -f $(obj)nand_spl/u-boot-spl $(obj)nand_spl/u-boot-spl.map @rm -f $(obj)onenand_ipl/onenand-ipl $(obj)onenand_ipl/onenand-ipl.bin \ - $(obj)onenand_ipl/onenand-ipl-2k.bin $(obj)onenand_ipl/onenand-ipl.map + $(obj)onenand_ipl/onenand-ipl-2k.bin \ + $(obj)onenand_ipl/onenand-ipl-4k.bin \ + $(obj)onenand_ipl/onenand-ipl.map @rm -f $(obj)api_examples/demo $(VERSION_FILE)
Sorry, this part of your patch conflicts with the current code. Please rebase and resubmit.
Best regards,
Wolfgang Denk
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de For every complex problem, there is a solution that is simple, neat, and wrong. - Mark Twain