X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=cmd%2Fmem.c;h=392ed1756b636ea89bfc40302134ccc05993cf41;hb=HEAD;hp=6d54f1952727e2cefcfacf06e8b52b3b8091c7c6;hpb=9a8942b53d57149754e0dfc975e0d92d1afd4087;p=thirdparty%2Fu-boot.git diff --git a/cmd/mem.c b/cmd/mem.c index 6d54f195272..768057e4d3f 100644 --- a/cmd/mem.c +++ b/cmd/mem.c @@ -16,20 +16,32 @@ #include #include #include +#include +#ifdef CONFIG_MTD_NOR_FLASH #include +#endif #include +#include #include +#include #include +#include #include +#include #include +#include +#include DECLARE_GLOBAL_DATA_PTR; -#ifndef CONFIG_SYS_MEMTEST_SCRATCH -#define CONFIG_SYS_MEMTEST_SCRATCH 0 +/* Create a compile-time value */ +#if MEM_SUPPORT_64BIT_DATA +#define HELP_Q ", .q" +#else +#define HELP_Q "" #endif -static int mod_mem(cmd_tbl_t *, int, int, int, char * const []); +static int mod_mem(struct cmd_tbl *, int, int, int, char * const []); /* Display values from last command. * Memory modify remembered values are different from display memory. @@ -39,6 +51,11 @@ static ulong dp_last_length = 0x40; static ulong mm_last_addr, mm_last_size; static ulong base_address = 0; +#ifdef CONFIG_CMD_MEM_SEARCH +static ulong dp_last_ms_length; +static u8 search_buf[64]; +static uint search_len; +#endif /* Memory Display * @@ -46,7 +63,8 @@ static ulong base_address = 0; * md{.b, .w, .l, .q} {addr} {len} */ #define DISP_LINE_LEN 16 -static int do_mem_md(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +static int do_mem_md(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { ulong addr, length, bytes; const void *buf; @@ -72,14 +90,14 @@ static int do_mem_md(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) /* Address is specified since argc > 1 */ - addr = simple_strtoul(argv[1], NULL, 16); + addr = hextoul(argv[1], NULL); addr += base_address; /* If another parameter, it is the length to display. * Length is the number of objects, not number of bytes. */ if (argc > 2) - length = simple_strtoul(argv[2], NULL, 16); + length = hextoul(argv[2], NULL); } bytes = size * length; @@ -96,22 +114,22 @@ static int do_mem_md(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return (rc); } -static int do_mem_mm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +static int do_mem_mm(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { return mod_mem (cmdtp, 1, flag, argc, argv); } -static int do_mem_nm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) + +static int do_mem_nm(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { return mod_mem (cmdtp, 0, flag, argc, argv); } -static int do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +static int do_mem_mw(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { -#ifdef MEM_SUPPORT_64BIT_DATA - u64 writeval; -#else - ulong writeval; -#endif + ulong writeval; /* 64-bit if MEM_SUPPORT_64BIT_DATA */ ulong addr, count; int size; void *buf, *start; @@ -127,20 +145,19 @@ static int do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) /* Address is specified since argc > 1 */ - addr = simple_strtoul(argv[1], NULL, 16); + addr = hextoul(argv[1], NULL); addr += base_address; /* Get the value to write. */ -#ifdef MEM_SUPPORT_64BIT_DATA - writeval = simple_strtoull(argv[2], NULL, 16); -#else - writeval = simple_strtoul(argv[2], NULL, 16); -#endif + if (MEM_SUPPORT_64BIT_DATA) + writeval = simple_strtoull(argv[2], NULL, 16); + else + writeval = hextoul(argv[2], NULL); /* Count ? */ if (argc == 4) { - count = simple_strtoul(argv[3], NULL, 16); + count = hextoul(argv[3], NULL); } else { count = 1; } @@ -151,10 +168,8 @@ static int do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) while (count-- > 0) { if (size == 4) *((u32 *)buf) = (u32)writeval; -#ifdef MEM_SUPPORT_64BIT_DATA - else if (size == 8) - *((u64 *)buf) = (u64)writeval; -#endif + else if (MEM_SUPPORT_64BIT_DATA && size == 8) + *((ulong *)buf) = writeval; else if (size == 2) *((u16 *)buf) = (u16)writeval; else @@ -166,7 +181,8 @@ static int do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) } #ifdef CONFIG_CMD_MX_CYCLIC -static int do_mem_mdc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +static int do_mem_mdc(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { int i; ulong count; @@ -174,14 +190,14 @@ static int do_mem_mdc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (argc < 4) return CMD_RET_USAGE; - count = simple_strtoul(argv[3], NULL, 10); + count = dectoul(argv[3], NULL); for (;;) { do_mem_md (NULL, 0, 3, argv); /* delay for ms... */ for (i=0; i ms... */ for (i=0; i 1 */ + addr = hextoul(argv[0], NULL); + addr += base_address; + + /* Length is the number of objects, not number of bytes */ + length = hextoul(argv[1], NULL); + + /* Read the bytes to search for */ + end = search_buf + sizeof(search_buf); + for (i = 2, ptr = search_buf; i < argc && ptr < end; i++) { + if (MEM_SUPPORT_64BIT_DATA && size == 8) { + u64 val = simple_strtoull(argv[i], NULL, 16); + + *(u64 *)ptr = val; + } else if (size == -2) { /* string */ + int len = min(strlen(argv[i]), + (size_t)(end - ptr)); + + memcpy(ptr, argv[i], len); + ptr += len; + continue; + } else { + u32 val = hextoul(argv[i], NULL); + + switch (size) { + case 1: + *ptr = val; + break; + case 2: + *(u16 *)ptr = val; + break; + case 4: + *(u32 *)ptr = val; + break; + } + } + ptr += size; + } + search_len = ptr - search_buf; + } + + /* Do the search */ + if (size == -2) + size = 1; + bytes = size * length; + buf = map_sysmem(addr, bytes); + last_pos = 0; + last_addr = 0; + count = 0; + for (offset = 0; + offset < bytes && offset <= bytes - search_len && count < limit; + offset += size) { + void *ptr = buf + offset; + + if (!memcmp(ptr, search_buf, search_len)) { + uint align = (addr + offset) & 0xf; + ulong match = addr + offset; + + if (!count || (last_addr & ~0xf) != (match & ~0xf)) { + if (!quiet) { + if (count) + printf("--\n"); + print_buffer(match - align, ptr - align, + size, + ALIGN(search_len + align, + 16) / size, 0); + } + last_addr = match; + last_pos = offset / size; + } + count++; + } + } + if (!quiet) { + printf("%d match%s", count, count == 1 ? "" : "es"); + if (count == limit) + printf(" (repeat command to check for more)"); + printf("\n"); + } + env_set_hex("memmatches", count); + env_set_hex("memaddr", last_addr); + env_set_hex("mempos", last_pos); + + unmap_sysmem(buf); + + used_len = offset / size; + dp_last_addr = addr + used_len; + dp_last_size = size; + dp_last_ms_length = length < used_len ? 0 : length - used_len; + + return count ? 0 : CMD_RET_FAILURE; +} +#endif + +static int do_mem_base(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { if (argc > 1) { /* Set new base address. */ - base_address = simple_strtoul(argv[1], NULL, 16); + base_address = hextoul(argv[1], NULL); } /* Print the current base address. */ @@ -373,14 +521,12 @@ static int do_mem_base(cmd_tbl_t *cmdtp, int flag, int argc, return 0; } -static int do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc, - char * const argv[]) +static int do_mem_loop(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { ulong addr, length, i, bytes; int size; -#ifdef MEM_SUPPORT_64BIT_DATA - volatile u64 *llp; -#endif + volatile ulong *llp; /* 64-bit if MEM_SUPPORT_64BIT_DATA */ volatile u32 *longp; volatile u16 *shortp; volatile u8 *cp; @@ -398,11 +544,11 @@ static int do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc, /* Address is always specified. */ - addr = simple_strtoul(argv[1], NULL, 16); + addr = hextoul(argv[1], NULL); /* Length is the number of objects, not number of bytes. */ - length = simple_strtoul(argv[2], NULL, 16); + length = hextoul(argv[2], NULL); bytes = size * length; buf = map_sysmem(addr, bytes); @@ -411,13 +557,11 @@ static int do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc, * If we have only one object, just run infinite loops. */ if (length == 1) { -#ifdef MEM_SUPPORT_64BIT_DATA - if (size == 8) { - llp = (u64 *)buf; + if (MEM_SUPPORT_64BIT_DATA && size == 8) { + llp = (ulong *)buf; for (;;) i = *llp; } -#endif if (size == 4) { longp = (u32 *)buf; for (;;) @@ -433,16 +577,14 @@ static int do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc, i = *cp; } -#ifdef MEM_SUPPORT_64BIT_DATA - if (size == 8) { + if (MEM_SUPPORT_64BIT_DATA && size == 8) { for (;;) { - llp = (u64 *)buf; + llp = (ulong *)buf; i = length; while (i-- > 0) *llp++; } } -#endif if (size == 4) { for (;;) { longp = (u32 *)buf; @@ -471,17 +613,13 @@ static int do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc, } #ifdef CONFIG_LOOPW -static int do_mem_loopw(cmd_tbl_t *cmdtp, int flag, int argc, - char * const argv[]) +static int do_mem_loopw(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { ulong addr, length, i, bytes; int size; -#ifdef MEM_SUPPORT_64BIT_DATA - volatile u64 *llp; - u64 data; -#else - ulong data; -#endif + volatile ulong *llp; /* 64-bit if MEM_SUPPORT_64BIT_DATA */ + ulong data; /* 64-bit if MEM_SUPPORT_64BIT_DATA */ volatile u32 *longp; volatile u16 *shortp; volatile u8 *cp; @@ -499,18 +637,17 @@ static int do_mem_loopw(cmd_tbl_t *cmdtp, int flag, int argc, /* Address is always specified. */ - addr = simple_strtoul(argv[1], NULL, 16); + addr = hextoul(argv[1], NULL); /* Length is the number of objects, not number of bytes. */ - length = simple_strtoul(argv[2], NULL, 16); + length = hextoul(argv[2], NULL); /* data to write */ -#ifdef MEM_SUPPORT_64BIT_DATA - data = simple_strtoull(argv[3], NULL, 16); -#else - data = simple_strtoul(argv[3], NULL, 16); -#endif + if (MEM_SUPPORT_64BIT_DATA) + data = simple_strtoull(argv[3], NULL, 16); + else + data = hextoul(argv[3], NULL); bytes = size * length; buf = map_sysmem(addr, bytes); @@ -519,13 +656,11 @@ static int do_mem_loopw(cmd_tbl_t *cmdtp, int flag, int argc, * If we have only one object, just run infinite loops. */ if (length == 1) { -#ifdef MEM_SUPPORT_64BIT_DATA - if (size == 8) { - llp = (u64 *)buf; + if (MEM_SUPPORT_64BIT_DATA && size == 8) { + llp = (ulong *)buf; for (;;) *llp = data; } -#endif if (size == 4) { longp = (u32 *)buf; for (;;) @@ -541,16 +676,14 @@ static int do_mem_loopw(cmd_tbl_t *cmdtp, int flag, int argc, *cp = data; } -#ifdef MEM_SUPPORT_64BIT_DATA - if (size == 8) { + if (MEM_SUPPORT_64BIT_DATA && size == 8) { for (;;) { - llp = (u64 *)buf; + llp = (ulong *)buf; i = length; while (i-- > 0) *llp++ = data; } } -#endif if (size == 4) { for (;;) { longp = (u32 *)buf; @@ -683,8 +816,8 @@ static ulong mem_test_alt(vu_long *buf, ulong start_addr, ulong end_addr, * * Returns: 0 if the test succeeds, 1 if the test fails. */ - pattern = (vu_long) 0xaaaaaaaa; - anti_pattern = (vu_long) 0x55555555; + pattern = (vu_long)0xaaaaaaaaaaaaaaaa; + anti_pattern = (vu_long)0x5555555555555555; debug("%s:%d: length = 0x%.8lx\n", __func__, __LINE__, num_words); /* @@ -713,7 +846,7 @@ static ulong mem_test_alt(vu_long *buf, ulong start_addr, ulong end_addr, } } addr[test_offset] = pattern; - WATCHDOG_RESET(); + schedule(); /* * Check for addr bits stuck low or shorted. @@ -755,7 +888,7 @@ static ulong mem_test_alt(vu_long *buf, ulong start_addr, ulong end_addr, * Fill memory with a known pattern. */ for (pattern = 1, offset = 0; offset < num_words; pattern++, offset++) { - WATCHDOG_RESET(); + schedule(); addr[offset] = pattern; } @@ -763,7 +896,7 @@ static ulong mem_test_alt(vu_long *buf, ulong start_addr, ulong end_addr, * Check each location and invert it for the second pass. */ for (pattern = 1, offset = 0; offset < num_words; pattern++, offset++) { - WATCHDOG_RESET(); + schedule(); temp = addr[offset]; if (temp != pattern) { printf("\nFAILURE (read/write) @ 0x%.8lx:" @@ -783,7 +916,7 @@ static ulong mem_test_alt(vu_long *buf, ulong start_addr, ulong end_addr, * Check each location for the inverted pattern and zero it. */ for (pattern = 1, offset = 0; offset < num_words; pattern++, offset++) { - WATCHDOG_RESET(); + schedule(); anti_pattern = ~pattern; temp = addr[offset]; if (temp != anti_pattern) { @@ -801,6 +934,71 @@ static ulong mem_test_alt(vu_long *buf, ulong start_addr, ulong end_addr, return errs; } +static int compare_regions(volatile unsigned long *bufa, + volatile unsigned long *bufb, size_t count) +{ + volatile unsigned long *p1 = bufa; + volatile unsigned long *p2 = bufb; + int errs = 0; + size_t i; + + for (i = 0; i < count; i++, p1++, p2++) { + if (*p1 != *p2) { + printf("FAILURE: 0x%08lx != 0x%08lx (delta=0x%08lx -> bit %ld) at offset 0x%08lx\n", + (unsigned long)*p1, (unsigned long)*p2, + *p1 ^ *p2, __ffs(*p1 ^ *p2), + (unsigned long)(i * sizeof(unsigned long))); + errs++; + } + } + + return errs; +} + +static ulong test_bitflip_comparison(volatile unsigned long *bufa, + volatile unsigned long *bufb, size_t count) +{ + volatile unsigned long *p1 = bufa; + volatile unsigned long *p2 = bufb; + unsigned int j, k; + unsigned long q; + size_t i; + int max; + int errs = 0; + + max = sizeof(unsigned long) * 8; + for (k = 0; k < max; k++) { + q = 1UL << k; + for (j = 0; j < 8; j++) { + schedule(); + q = ~q; + p1 = (volatile unsigned long *)bufa; + p2 = (volatile unsigned long *)bufb; + for (i = 0; i < count; i++) + *p1++ = *p2++ = (i % 2) == 0 ? q : ~q; + + errs += compare_regions(bufa, bufb, count); + } + + if (ctrlc()) + return -1UL; + } + + return errs; +} + +static ulong mem_test_bitflip(vu_long *buf, ulong start, ulong end) +{ + /* + * Split the specified range into two halves. + * Note that mtest range is inclusive of start,end. + * Bitflip test instead uses a count (of 32-bit words). + */ + ulong half_size = (end - start + 1) / 2 / sizeof(unsigned long); + + return test_bitflip_comparison(buf, buf + half_size, half_size); +} + static ulong mem_test_quick(vu_long *buf, ulong start_addr, ulong end_addr, vu_long pattern, int iteration) { @@ -809,6 +1007,7 @@ static ulong mem_test_quick(vu_long *buf, ulong start_addr, ulong end_addr, ulong errs = 0; ulong incr, length; ulong val, readback; + const int plen = 2 * sizeof(ulong); /* Alternate the pattern */ incr = 1; @@ -820,20 +1019,20 @@ static ulong mem_test_quick(vu_long *buf, ulong start_addr, ulong end_addr, * the "negative" patterns and increment the "positive" * patterns to preserve this feature. */ - if (pattern & 0x80000000) + if (pattern > (ulong)LONG_MAX) pattern = -pattern; /* complement & increment */ else pattern = ~pattern; } length = (end_addr - start_addr) / sizeof(ulong); end = buf + length; - printf("\rPattern %08lX Writing..." + printf("\rPattern %0*lX Writing..." "%12s" "\b\b\b\b\b\b\b\b\b\b", - pattern, ""); + plen, pattern, ""); for (addr = buf, val = pattern; addr < end; addr++) { - WATCHDOG_RESET(); + schedule(); *addr = val; val += incr; } @@ -841,15 +1040,14 @@ static ulong mem_test_quick(vu_long *buf, ulong start_addr, ulong end_addr, puts("Reading..."); for (addr = buf, val = pattern; addr < end; addr++) { - WATCHDOG_RESET(); + schedule(); readback = *addr; if (readback != val) { ulong offset = addr - buf; - printf("\nMem error @ 0x%08X: " - "found %08lX, expected %08lX\n", - (uint)(uintptr_t)(start_addr + offset*sizeof(vu_long)), - readback, val); + printf("\nMem error @ 0x%0*lX: found %0*lX, expected %0*lX\n", + plen, start_addr + offset * sizeof(vu_long), + plen, readback, plen, val); errs++; if (ctrlc()) return -1; @@ -865,21 +1063,17 @@ static ulong mem_test_quick(vu_long *buf, ulong start_addr, ulong end_addr, * configured using CONFIG_SYS_ALT_MEMTEST. The complete test loops until * interrupted by ctrl-c or by a failure of one of the sub-tests. */ -static int do_mem_mtest(cmd_tbl_t *cmdtp, int flag, int argc, - char * const argv[]) +static int do_mem_mtest(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { ulong start, end; - vu_long *buf, *dummy; + vu_long scratch_space; + vu_long *buf, *dummy = &scratch_space; ulong iteration_limit = 0; - int ret; + ulong count = 0; ulong errs = 0; /* number of errors, or -1 if interrupted */ ulong pattern = 0; int iteration; -#if defined(CONFIG_SYS_ALT_MEMTEST) - const int alt_test = 1; -#else - const int alt_test = 0; -#endif start = CONFIG_SYS_MEMTEST_START; end = CONFIG_SYS_MEMTEST_END; @@ -910,7 +1104,6 @@ static int do_mem_mtest(cmd_tbl_t *cmdtp, int flag, int argc, start, end); buf = map_sysmem(start, end - start); - dummy = map_sysmem(CONFIG_SYS_MEMTEST_SCRATCH, sizeof(vu_long)); for (iteration = 0; !iteration_limit || iteration < iteration_limit; iteration++) { @@ -921,40 +1114,28 @@ static int do_mem_mtest(cmd_tbl_t *cmdtp, int flag, int argc, printf("Iteration: %6d\r", iteration + 1); debug("\n"); - if (alt_test) { + if (IS_ENABLED(CONFIG_SYS_ALT_MEMTEST)) { errs = mem_test_alt(buf, start, end, dummy); + if (errs == -1UL) + break; + if (IS_ENABLED(CONFIG_SYS_ALT_MEMTEST_BITFLIP)) { + count += errs; + errs = mem_test_bitflip(buf, start, end); + } } else { errs = mem_test_quick(buf, start, end, pattern, iteration); } if (errs == -1UL) break; + count += errs; } - /* - * Work-around for eldk-4.2 which gives this warning if we try to - * case in the unmap_sysmem() call: - * warning: initialization discards qualifiers from pointer target type - */ - { - void *vbuf = (void *)buf; - void *vdummy = (void *)dummy; - - unmap_sysmem(vbuf); - unmap_sysmem(vdummy); - } + unmap_sysmem((void *)buf); - if (errs == -1UL) { - /* Memory test was aborted - write a newline to finish off */ - putc('\n'); - ret = 1; - } else { - printf("Tested %d iteration(s) with %lu errors.\n", - iteration, errs); - ret = errs != 0; - } + printf("\nTested %d iteration(s) with %lu errors.\n", iteration, count); - return ret; + return errs != 0; } #endif /* CONFIG_CMD_MEMTEST */ @@ -962,17 +1143,13 @@ static int do_mem_mtest(cmd_tbl_t *cmdtp, int flag, int argc, * * Syntax: * mm{.b, .w, .l, .q} {addr} - * nm{.b, .w, .l, .q} {addr} */ static int -mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[]) +mod_mem(struct cmd_tbl *cmdtp, int incrflag, int flag, int argc, + char *const argv[]) { ulong addr; -#ifdef MEM_SUPPORT_64BIT_DATA - u64 i; -#else - ulong i; -#endif + ulong i; /* 64-bit if MEM_SUPPORT_64BIT_DATA */ int nbytes, size; void *ptr = NULL; @@ -995,7 +1172,7 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[]) /* Address is specified since argc > 1 */ - addr = simple_strtoul(argv[1], NULL, 16); + addr = hextoul(argv[1], NULL); addr += base_address; } @@ -1007,10 +1184,8 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[]) printf("%08lx:", addr); if (size == 4) printf(" %08x", *((u32 *)ptr)); -#ifdef MEM_SUPPORT_64BIT_DATA - else if (size == 8) - printf(" %016llx", *((u64 *)ptr)); -#endif + else if (MEM_SUPPORT_64BIT_DATA && size == 8) + printf(" %0lx", *((ulong *)ptr)); else if (size == 2) printf(" %04x", *((u16 *)ptr)); else @@ -1034,11 +1209,10 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[]) #endif else { char *endp; -#ifdef MEM_SUPPORT_64BIT_DATA - i = simple_strtoull(console_buffer, &endp, 16); -#else - i = simple_strtoul(console_buffer, &endp, 16); -#endif + if (MEM_SUPPORT_64BIT_DATA) + i = simple_strtoull(console_buffer, &endp, 16); + else + i = hextoul(console_buffer, &endp); nbytes = endp - console_buffer; if (nbytes) { /* good enough to not time out @@ -1046,10 +1220,8 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[]) bootretry_reset_cmd_timeout(); if (size == 4) *((u32 *)ptr) = i; -#ifdef MEM_SUPPORT_64BIT_DATA - else if (size == 8) - *((u64 *)ptr) = i; -#endif + else if (MEM_SUPPORT_64BIT_DATA && size == 8) + *((ulong *)ptr) = i; else if (size == 2) *((u16 *)ptr) = i; else @@ -1069,7 +1241,8 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[]) #ifdef CONFIG_CMD_CRC32 -static int do_mem_crc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +static int do_mem_crc(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { int flags = 0; int ac; @@ -1094,7 +1267,8 @@ static int do_mem_crc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) #endif #ifdef CONFIG_CMD_RANDOM -static int do_random(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +static int do_random(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { unsigned long addr, len; unsigned long seed; // NOT INITIALIZED ON PURPOSE @@ -1102,16 +1276,14 @@ static int do_random(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) unsigned char *buf8; unsigned int i; - if (argc < 3 || argc > 4) { - printf("usage: %s []\n", argv[0]); - return 0; - } + if (argc < 3 || argc > 4) + return CMD_RET_USAGE; - len = simple_strtoul(argv[2], NULL, 16); - addr = simple_strtoul(argv[1], NULL, 16); + len = hextoul(argv[2], NULL); + addr = hextoul(argv[1], NULL); if (argc == 4) { - seed = simple_strtoul(argv[3], NULL, 16); + seed = hextoul(argv[3], NULL); if (seed == 0) { printf("The seed cannot be 0. Using 0xDEADBEEF.\n"); seed = 0xDEADBEEF; @@ -1132,7 +1304,8 @@ static int do_random(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) unmap_sysmem(start); printf("%lu bytes filled with random data\n", len); - return 1; + + return CMD_RET_SUCCESS; } #endif @@ -1140,64 +1313,50 @@ static int do_random(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) U_BOOT_CMD( md, 3, 1, do_mem_md, "memory display", -#ifdef MEM_SUPPORT_64BIT_DATA - "[.b, .w, .l, .q] address [# of objects]" -#else - "[.b, .w, .l] address [# of objects]" -#endif + "[.b, .w, .l" HELP_Q "] address [# of objects]" ); U_BOOT_CMD( mm, 2, 1, do_mem_mm, "memory modify (auto-incrementing address)", -#ifdef MEM_SUPPORT_64BIT_DATA - "[.b, .w, .l, .q] address" -#else - "[.b, .w, .l] address" -#endif + "[.b, .w, .l" HELP_Q "] address" ); U_BOOT_CMD( nm, 2, 1, do_mem_nm, "memory modify (constant address)", -#ifdef MEM_SUPPORT_64BIT_DATA - "[.b, .w, .l, .q] address" -#else - "[.b, .w, .l] address" -#endif + "[.b, .w, .l" HELP_Q "] address" ); U_BOOT_CMD( mw, 4, 1, do_mem_mw, "memory write (fill)", -#ifdef MEM_SUPPORT_64BIT_DATA - "[.b, .w, .l, .q] address value [count]" -#else - "[.b, .w, .l] address value [count]" -#endif + "[.b, .w, .l" HELP_Q "] address value [count]" ); U_BOOT_CMD( cp, 4, 1, do_mem_cp, "memory copy", -#ifdef MEM_SUPPORT_64BIT_DATA - "[.b, .w, .l, .q] source target count" -#else - "[.b, .w, .l] source target count" -#endif + "[.b, .w, .l" HELP_Q "] source target count" ); U_BOOT_CMD( cmp, 4, 1, do_mem_cmp, "memory compare", -#ifdef MEM_SUPPORT_64BIT_DATA - "[.b, .w, .l, .q] addr1 addr2 count" -#else - "[.b, .w, .l] addr1 addr2 count" -#endif + "[.b, .w, .l" HELP_Q "] addr1 addr2 count" +); + +#ifdef CONFIG_CMD_MEM_SEARCH +/**************************************************/ +U_BOOT_CMD( + ms, 255, 1, do_mem_search, + "memory search", + "[.b, .w, .l" HELP_Q ", .s] [-q | -] address #-of-objects ..." + " -q = quiet, -l = match limit" ); +#endif #ifdef CONFIG_CMD_CRC32 @@ -1223,8 +1382,8 @@ U_BOOT_CMD( #endif #ifdef CONFIG_CMD_MEMINFO -static int do_mem_info(cmd_tbl_t *cmdtp, int flag, int argc, - char * const argv[]) +static int do_mem_info(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { puts("DRAM: "); print_size(gd->ram_size, "\n"); @@ -1243,22 +1402,14 @@ U_BOOT_CMD( U_BOOT_CMD( loop, 3, 1, do_mem_loop, "infinite loop on address range", -#ifdef MEM_SUPPORT_64BIT_DATA - "[.b, .w, .l, .q] address number_of_objects" -#else - "[.b, .w, .l] address number_of_objects" -#endif + "[.b, .w, .l" HELP_Q "] address number_of_objects" ); #ifdef CONFIG_LOOPW U_BOOT_CMD( loopw, 4, 1, do_mem_loopw, "infinite write loop on address range", -#ifdef MEM_SUPPORT_64BIT_DATA - "[.b, .w, .l, .q] address number_of_objects data_to_write" -#else - "[.b, .w, .l] address number_of_objects data_to_write" -#endif + "[.b, .w, .l" HELP_Q "] address number_of_objects data_to_write" ); #endif /* CONFIG_LOOPW */ @@ -1274,21 +1425,13 @@ U_BOOT_CMD( U_BOOT_CMD( mdc, 4, 1, do_mem_mdc, "memory display cyclic", -#ifdef MEM_SUPPORT_64BIT_DATA - "[.b, .w, .l, .q] address count delay(ms)" -#else - "[.b, .w, .l] address count delay(ms)" -#endif + "[.b, .w, .l" HELP_Q "] address count delay(ms)" ); U_BOOT_CMD( mwc, 4, 1, do_mem_mwc, "memory write cyclic", -#ifdef MEM_SUPPORT_64BIT_DATA - "[.b, .w, .l, .q] address value delay(ms)" -#else - "[.b, .w, .l] address value delay(ms)" -#endif + "[.b, .w, .l" HELP_Q "] address value delay(ms)" ); #endif /* CONFIG_CMD_MX_CYCLIC */