mirror of
https://github.com/Stichting-MINIX-Research-Foundation/u-boot.git
synced 2025-09-16 07:27:09 -04:00
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:
parent
66c7f39923
commit
f99613782a
@ -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;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user