SPL: ONENAND: Fix onenand_spl_load_image implementation.

Tested with an IGEPv2 board seems that current onenand_spl_load_image implementation
doesn't work. This patch fixes this function changing the read loop and reading the
onenand blocks from page to page.

Tested with various IGEP based boards with a OneNAND from Numonyx.

Signed-off-by: Enric Balletbo i Serra <eballetbo@iseebcn.com>
This commit is contained in:
Enric Balletbo i Serra 2013-02-07 23:14:47 +00:00 committed by Tom Rini
parent 66c7f39923
commit f99613782a

View File

@ -112,7 +112,7 @@ static int onenand_spl_read_page(uint32_t block, uint32_t page, uint32_t *buf,
void onenand_spl_load_image(uint32_t offs, uint32_t size, void *dst) void onenand_spl_load_image(uint32_t offs, uint32_t size, void *dst)
{ {
uint32_t *addr = (uint32_t *)dst; uint32_t *addr = (uint32_t *)dst;
uint32_t total_pages; uint32_t to_page;
uint32_t block; uint32_t block;
uint32_t page, rpage; uint32_t page, rpage;
enum onenand_spl_pagesize pagesize; enum onenand_spl_pagesize pagesize;
@ -125,22 +125,20 @@ void onenand_spl_load_image(uint32_t offs, uint32_t size, void *dst)
* pulling further unwanted functions into the SPL. * pulling further unwanted functions into the SPL.
*/ */
if (pagesize == 2048) { if (pagesize == 2048) {
total_pages = DIV_ROUND_UP(size, 2048);
page = offs / 2048; page = offs / 2048;
to_page = page + DIV_ROUND_UP(size, 2048);
} else { } else {
total_pages = DIV_ROUND_UP(size, 4096);
page = offs / 4096; page = offs / 4096;
to_page = page + DIV_ROUND_UP(size, 4096);
} }
for (; page <= total_pages; page++) { for (; page <= to_page; page++) {
block = page / ONENAND_PAGES_PER_BLOCK; block = page / ONENAND_PAGES_PER_BLOCK;
rpage = page & (ONENAND_PAGES_PER_BLOCK - 1); rpage = page & (ONENAND_PAGES_PER_BLOCK - 1);
ret = onenand_spl_read_page(block, rpage, addr, pagesize); ret = onenand_spl_read_page(block, rpage, addr, pagesize);
if (ret) { if (ret)
total_pages += ONENAND_PAGES_PER_BLOCK;
page += ONENAND_PAGES_PER_BLOCK - 1; page += ONENAND_PAGES_PER_BLOCK - 1;
} else { else
addr += pagesize / 4; addr += pagesize / 4;
}
} }
} }