[U-Boot] [PATCH] Fix OneNAND ipl to read 256KB

Rohit Hagargundgi h.rohit at samsung.com
Sun Mar 8 07:50:02 CET 2009


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



More information about the U-Boot mailing list