cmd: mem: Use memcpy for 'cp' command

Simplify the 'cp' command implementation by using the memcpy() function,
which brings the additional benefit of performance gain for those who have
CONFIG_USE_ARCH_MEMCPY selected.

Tested on a mx6qsabreauto board where a 5x gain in performance is seen
when reading 10MB from the parallel NOR memory.

Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
This commit is contained in:
Fabio Estevam 2016-12-15 16:00:13 -02:00 committed by Tom Rini
parent 4386feb73d
commit c2538421b2

View file

@ -372,10 +372,8 @@ static int do_mem_cmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
static int do_mem_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
ulong addr, dest, count, bytes;
ulong addr, dest, count;
int size;
const void *src;
void *buf;
if (argc != 4)
return CMD_RET_USAGE;
@ -465,29 +463,7 @@ static int do_mem_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
}
#endif
bytes = size * count;
buf = map_sysmem(dest, bytes);
src = map_sysmem(addr, bytes);
while (count-- > 0) {
if (size == 4)
*((u32 *)buf) = *((u32 *)src);
#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
else if (size == 8)
*((u64 *)buf) = *((u64 *)src);
#endif
else if (size == 2)
*((u16 *)buf) = *((u16 *)src);
else
*((u8 *)buf) = *((u8 *)src);
src += size;
buf += size;
/* reset watchdog from time to time */
if ((count % (64 << 10)) == 0)
WATCHDOG_RESET();
}
unmap_sysmem(buf);
unmap_sysmem(src);
memcpy((void *)dest, (void *)addr, count * size);
return 0;
}