Skip to content
Snippets Groups Projects
Commit 09852946 authored by Lokesh Vutla's avatar Lokesh Vutla Committed by Tom Rini
Browse files

mtd: nand: am335x: spl: Fix copying of image


When offset is not aligned to page address, it is possible that extra offset
will be read from nand. Adjust the image such that first byte of the image
is at load address after the first page is read.

Reviewed-by: default avatarTom Rini <trini@konsulko.com>
Signed-off-by: default avatarLokesh Vutla <lokeshvutla@ti.com>
parent 00d55956
No related branches found
No related tags found
No related merge requests found
...@@ -173,7 +173,7 @@ static int nand_read_page(int block, int page, void *dst) ...@@ -173,7 +173,7 @@ static int nand_read_page(int block, int page, void *dst)
int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst) int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst)
{ {
unsigned int block, lastblock; unsigned int block, lastblock;
unsigned int page; unsigned int page, page_offset;
/* /*
* offs has to be aligned to a page address! * offs has to be aligned to a page address!
...@@ -181,6 +181,7 @@ int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst) ...@@ -181,6 +181,7 @@ int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst)
block = offs / CONFIG_SYS_NAND_BLOCK_SIZE; block = offs / CONFIG_SYS_NAND_BLOCK_SIZE;
lastblock = (offs + size - 1) / CONFIG_SYS_NAND_BLOCK_SIZE; lastblock = (offs + size - 1) / CONFIG_SYS_NAND_BLOCK_SIZE;
page = (offs % CONFIG_SYS_NAND_BLOCK_SIZE) / CONFIG_SYS_NAND_PAGE_SIZE; page = (offs % CONFIG_SYS_NAND_BLOCK_SIZE) / CONFIG_SYS_NAND_PAGE_SIZE;
page_offset = offs % CONFIG_SYS_NAND_PAGE_SIZE;
while (block <= lastblock) { while (block <= lastblock) {
if (!nand_is_bad_block(block)) { if (!nand_is_bad_block(block)) {
...@@ -189,6 +190,18 @@ int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst) ...@@ -189,6 +190,18 @@ int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst)
*/ */
while (page < CONFIG_SYS_NAND_PAGE_COUNT) { while (page < CONFIG_SYS_NAND_PAGE_COUNT) {
nand_read_page(block, page, dst); nand_read_page(block, page, dst);
/*
* When offs is not aligned to page address the
* extra offset is copied to dst as well. Copy
* the image such that its first byte will be
* at the dst.
*/
if (unlikely(page_offset)) {
memmove(dst, dst + page_offset,
CONFIG_SYS_NAND_PAGE_SIZE);
dst = (void *)((int)dst - page_offset);
page_offset = 0;
}
dst += CONFIG_SYS_NAND_PAGE_SIZE; dst += CONFIG_SYS_NAND_PAGE_SIZE;
page++; page++;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment