Hi, Kyungmin Park wrote: >> >> + /* Check for invalid block mark*/ >> + if (page < 2 && (onenand_readw(THIS_ONENAND(ONENAND_SPARERAM)) != >> 0xffff)) >> + return 1; >> + > > No need to check invalid block. Note that block 0 is always good > block. no exception.
Correct. block 0 is guaranteed to be good. > Now you assume block 1 can be invalid block. If true just skip it. > when update bootloader at u-boot or kernel. > there's bad block at block 1. it will skip write. it means bootloader > are located at block 0 and block 2. yes, block 1 is invalid so block 0 and block 2 store bootloader. so in ipl, we need to check invalid mark. block 1 is detected bad. block 1 is skipped and block 2 is read for bootloader. >> + int nblocks = CONFIG_SYS_MONITOR_LEN / (ONENAND_PAGES_PER_BLOCK * >> ONENAND_PAGE_SIZE); >> >> /* MLC OneNAND has 4KiB page size */ >> - if (onenand_readw(THIS_ONENAND(ONENAND_REG_TECHNOLOGY))) >> + if (onenand_readw(THIS_ONENAND(ONENAND_REG_TECHNOLOGY))) { >> pagesize <<= 1; >> + nblocks = (nblocks + 1) >> 1; >> + } assuming page size of 2KB, nblocks is initialised to 2. for 4KB paged devices (like Flex-OneNAND), nblocks gets halved ie 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(0, page, buf + offset, pagesize); >> - offset += pagesize; >> + page = ONENAND_START_PAGE; >> + for (; block < nblocks; block++) { >> + for (; page < ONENAND_PAGES_PER_BLOCK; page++) { >> + if (onenand_read_page(block, page, buf + offset, >> pagesize)) { >> + /* This block is bad. Skip it and read next >> block */ >> + nblocks++; >> + break; >> + } >> + offset += pagesize; >> + } >> + page = 0; >> } >> >> return 0; > > NAK, please use previous one as I sent. > In Flex-OneNAND block 0 has 256KiB. need to handle at here how many > blocks are needed. this is taken care above. > I also want to use CONFIG_ONENAND_END_BLOCK since we don't know which > OneNAND or Flex-OneNAND are attached to apollon board. okay. but why not use a variable instead. Thanks, Rohit _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot