|
@@ -41,7 +41,7 @@ static ulong base_address = 0;
|
|
|
/* Memory Display
|
|
|
*
|
|
|
* Syntax:
|
|
|
- * md{.b, .w, .l} {addr} {len}
|
|
|
+ * 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[])
|
|
@@ -155,7 +155,12 @@ static int do_mem_nm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
|
|
|
static int do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
{
|
|
|
- ulong addr, writeval, count;
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ u64 writeval;
|
|
|
+#else
|
|
|
+ ulong writeval;
|
|
|
+#endif
|
|
|
+ ulong addr, count;
|
|
|
int size;
|
|
|
void *buf;
|
|
|
ulong bytes;
|
|
@@ -175,7 +180,11 @@ static int do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
|
|
|
/* Get the value to write.
|
|
|
*/
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ writeval = simple_strtoull(argv[2], NULL, 16);
|
|
|
+#else
|
|
|
writeval = simple_strtoul(argv[2], NULL, 16);
|
|
|
+#endif
|
|
|
|
|
|
/* Count ? */
|
|
|
if (argc == 4) {
|
|
@@ -189,6 +198,10 @@ 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 CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ else if (size == 8)
|
|
|
+ *((u64 *)buf) = (u64)writeval;
|
|
|
+#endif
|
|
|
else if (size == 2)
|
|
|
*((u16 *)buf) = (u16)writeval;
|
|
|
else
|
|
@@ -262,6 +275,11 @@ static int do_mem_cmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
int rcode = 0;
|
|
|
const char *type;
|
|
|
const void *buf1, *buf2, *base;
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ u64 word1, word2;
|
|
|
+#else
|
|
|
+ ulong word1, word2;
|
|
|
+#endif
|
|
|
|
|
|
if (argc != 4)
|
|
|
return CMD_RET_USAGE;
|
|
@@ -270,7 +288,9 @@ static int do_mem_cmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
*/
|
|
|
if ((size = cmd_get_data_size(argv[0], 4)) < 0)
|
|
|
return 1;
|
|
|
- type = size == 4 ? "word" : size == 2 ? "halfword" : "byte";
|
|
|
+ type = size == 8 ? "double word" :
|
|
|
+ size == 4 ? "word" :
|
|
|
+ size == 2 ? "halfword" : "byte";
|
|
|
|
|
|
addr1 = simple_strtoul(argv[1], NULL, 16);
|
|
|
addr1 += base_address;
|
|
@@ -298,10 +318,14 @@ static int do_mem_cmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
base = buf1 = map_sysmem(addr1, bytes);
|
|
|
buf2 = map_sysmem(addr2, bytes);
|
|
|
for (ngood = 0; ngood < count; ++ngood) {
|
|
|
- ulong word1, word2;
|
|
|
if (size == 4) {
|
|
|
word1 = *(u32 *)buf1;
|
|
|
word2 = *(u32 *)buf2;
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ } else if (size == 8) {
|
|
|
+ word1 = *(u64 *)buf1;
|
|
|
+ word2 = *(u64 *)buf2;
|
|
|
+#endif
|
|
|
} else if (size == 2) {
|
|
|
word1 = *(u16 *)buf1;
|
|
|
word2 = *(u16 *)buf2;
|
|
@@ -311,10 +335,15 @@ static int do_mem_cmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
}
|
|
|
if (word1 != word2) {
|
|
|
ulong offset = buf1 - base;
|
|
|
-
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ printf("%s at 0x%p (%#0*llx) != %s at 0x%p (%#0*llx)\n",
|
|
|
+ type, (void *)(addr1 + offset), size, word1,
|
|
|
+ type, (void *)(addr2 + offset), size, word2);
|
|
|
+#else
|
|
|
printf("%s at 0x%08lx (%#0*lx) != %s at 0x%08lx (%#0*lx)\n",
|
|
|
type, (ulong)(addr1 + offset), size, word1,
|
|
|
type, (ulong)(addr2 + offset), size, word2);
|
|
|
+#endif
|
|
|
rcode = 1;
|
|
|
break;
|
|
|
}
|
|
@@ -434,6 +463,10 @@ static int do_mem_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
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
|
|
@@ -467,6 +500,9 @@ static int do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc,
|
|
|
{
|
|
|
ulong addr, length, i, bytes;
|
|
|
int size;
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ volatile u64 *llp;
|
|
|
+#endif
|
|
|
volatile u32 *longp;
|
|
|
volatile u16 *shortp;
|
|
|
volatile u8 *cp;
|
|
@@ -497,6 +533,13 @@ 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 CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ if (size == 8) {
|
|
|
+ llp = (u64 *)buf;
|
|
|
+ for (;;)
|
|
|
+ i = *llp;
|
|
|
+ }
|
|
|
+#endif
|
|
|
if (size == 4) {
|
|
|
longp = (u32 *)buf;
|
|
|
for (;;)
|
|
@@ -512,6 +555,16 @@ static int do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc,
|
|
|
i = *cp;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ if (size == 8) {
|
|
|
+ for (;;) {
|
|
|
+ llp = (u64 *)buf;
|
|
|
+ i = length;
|
|
|
+ while (i-- > 0)
|
|
|
+ *llp++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
if (size == 4) {
|
|
|
for (;;) {
|
|
|
longp = (u32 *)buf;
|
|
@@ -542,8 +595,14 @@ static int do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc,
|
|
|
#ifdef CONFIG_LOOPW
|
|
|
int do_mem_loopw (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
{
|
|
|
- ulong addr, length, i, data, bytes;
|
|
|
+ ulong addr, length, i, bytes;
|
|
|
int size;
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ volatile u64 *llp;
|
|
|
+ u64 data;
|
|
|
+#else
|
|
|
+ ulong data;
|
|
|
+#endif
|
|
|
volatile u32 *longp;
|
|
|
volatile u16 *shortp;
|
|
|
volatile u8 *cp;
|
|
@@ -568,7 +627,11 @@ int do_mem_loopw (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
length = simple_strtoul(argv[2], NULL, 16);
|
|
|
|
|
|
/* data to write */
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ data = simple_strtoull(argv[3], NULL, 16);
|
|
|
+#else
|
|
|
data = simple_strtoul(argv[3], NULL, 16);
|
|
|
+#endif
|
|
|
|
|
|
bytes = size * length;
|
|
|
buf = map_sysmem(addr, bytes);
|
|
@@ -577,11 +640,18 @@ int do_mem_loopw (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
* If we have only one object, just run infinite loops.
|
|
|
*/
|
|
|
if (length == 1) {
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ if (size == 8) {
|
|
|
+ llp = (u64 *)buf;
|
|
|
+ for (;;)
|
|
|
+ *llp = data;
|
|
|
+ }
|
|
|
+#endif
|
|
|
if (size == 4) {
|
|
|
longp = (u32 *)buf;
|
|
|
for (;;)
|
|
|
*longp = data;
|
|
|
- }
|
|
|
+ }
|
|
|
if (size == 2) {
|
|
|
shortp = (u16 *)buf;
|
|
|
for (;;)
|
|
@@ -592,6 +662,16 @@ int do_mem_loopw (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
*cp = data;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ if (size == 8) {
|
|
|
+ for (;;) {
|
|
|
+ llp = (u64 *)buf;
|
|
|
+ i = length;
|
|
|
+ while (i-- > 0)
|
|
|
+ *llp++ = data;
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
if (size == 4) {
|
|
|
for (;;) {
|
|
|
longp = (u32 *)buf;
|
|
@@ -998,13 +1078,18 @@ static int do_mem_mtest(cmd_tbl_t *cmdtp, int flag, int argc,
|
|
|
/* Modify memory.
|
|
|
*
|
|
|
* Syntax:
|
|
|
- * mm{.b, .w, .l} {addr}
|
|
|
- * nm{.b, .w, .l} {addr}
|
|
|
+ * 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[])
|
|
|
{
|
|
|
- ulong addr, i;
|
|
|
+ ulong addr;
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ u64 i;
|
|
|
+#else
|
|
|
+ ulong i;
|
|
|
+#endif
|
|
|
int nbytes, size;
|
|
|
void *ptr = NULL;
|
|
|
|
|
@@ -1055,6 +1140,10 @@ 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 CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ else if (size == 8)
|
|
|
+ printf(" %016llx", *((u64 *)ptr));
|
|
|
+#endif
|
|
|
else if (size == 2)
|
|
|
printf(" %04x", *((u16 *)ptr));
|
|
|
else
|
|
@@ -1079,7 +1168,11 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
|
|
|
#endif
|
|
|
else {
|
|
|
char *endp;
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ i = simple_strtoull(console_buffer, &endp, 16);
|
|
|
+#else
|
|
|
i = simple_strtoul(console_buffer, &endp, 16);
|
|
|
+#endif
|
|
|
nbytes = endp - console_buffer;
|
|
|
if (nbytes) {
|
|
|
#ifdef CONFIG_BOOT_RETRY_TIME
|
|
@@ -1089,6 +1182,10 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
|
|
|
#endif
|
|
|
if (size == 4)
|
|
|
*((u32 *)ptr) = i;
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ else if (size == 8)
|
|
|
+ *((u64 *)ptr) = i;
|
|
|
+#endif
|
|
|
else if (size == 2)
|
|
|
*((u16 *)ptr) = i;
|
|
|
else
|
|
@@ -1136,39 +1233,63 @@ static int do_mem_crc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
U_BOOT_CMD(
|
|
|
md, 3, 1, do_mem_md,
|
|
|
"memory display",
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ "[.b, .w, .l, .q] address [# of objects]"
|
|
|
+#else
|
|
|
"[.b, .w, .l] address [# of objects]"
|
|
|
+#endif
|
|
|
);
|
|
|
|
|
|
|
|
|
U_BOOT_CMD(
|
|
|
mm, 2, 1, do_mem_mm,
|
|
|
"memory modify (auto-incrementing address)",
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ "[.b, .w, .l, .q] address"
|
|
|
+#else
|
|
|
"[.b, .w, .l] address"
|
|
|
+#endif
|
|
|
);
|
|
|
|
|
|
|
|
|
U_BOOT_CMD(
|
|
|
nm, 2, 1, do_mem_nm,
|
|
|
"memory modify (constant address)",
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ "[.b, .w, .l, .q] address"
|
|
|
+#else
|
|
|
"[.b, .w, .l] address"
|
|
|
+#endif
|
|
|
);
|
|
|
|
|
|
U_BOOT_CMD(
|
|
|
mw, 4, 1, do_mem_mw,
|
|
|
"memory write (fill)",
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ "[.b, .w, .l, .q] address value [count]"
|
|
|
+#else
|
|
|
"[.b, .w, .l] address value [count]"
|
|
|
+#endif
|
|
|
);
|
|
|
|
|
|
U_BOOT_CMD(
|
|
|
cp, 4, 1, do_mem_cp,
|
|
|
"memory copy",
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ "[.b, .w, .l, .q] source target count"
|
|
|
+#else
|
|
|
"[.b, .w, .l] source target count"
|
|
|
+#endif
|
|
|
);
|
|
|
|
|
|
U_BOOT_CMD(
|
|
|
cmp, 4, 1, do_mem_cmp,
|
|
|
"memory compare",
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ "[.b, .w, .l, .q] addr1 addr2 count"
|
|
|
+#else
|
|
|
"[.b, .w, .l] addr1 addr2 count"
|
|
|
+#endif
|
|
|
);
|
|
|
|
|
|
#ifdef CONFIG_CMD_CRC32
|
|
@@ -1220,14 +1341,22 @@ U_BOOT_CMD(
|
|
|
U_BOOT_CMD(
|
|
|
loop, 3, 1, do_mem_loop,
|
|
|
"infinite loop on address range",
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ "[.b, .w, .l, .q] address number_of_objects"
|
|
|
+#else
|
|
|
"[.b, .w, .l] address number_of_objects"
|
|
|
+#endif
|
|
|
);
|
|
|
|
|
|
#ifdef CONFIG_LOOPW
|
|
|
U_BOOT_CMD(
|
|
|
loopw, 4, 1, do_mem_loopw,
|
|
|
"infinite write loop on address range",
|
|
|
+#ifdef CONFIG_SYS_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
|
|
|
);
|
|
|
#endif /* CONFIG_LOOPW */
|
|
|
|
|
@@ -1243,13 +1372,21 @@ U_BOOT_CMD(
|
|
|
U_BOOT_CMD(
|
|
|
mdc, 4, 1, do_mem_mdc,
|
|
|
"memory display cyclic",
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ "[.b, .w, .l, .q] address count delay(ms)"
|
|
|
+#else
|
|
|
"[.b, .w, .l] address count delay(ms)"
|
|
|
+#endif
|
|
|
);
|
|
|
|
|
|
U_BOOT_CMD(
|
|
|
mwc, 4, 1, do_mem_mwc,
|
|
|
"memory write cyclic",
|
|
|
+#ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
|
|
|
+ "[.b, .w, .l, .q] address value delay(ms)"
|
|
|
+#else
|
|
|
"[.b, .w, .l] address value delay(ms)"
|
|
|
+#endif
|
|
|
);
|
|
|
#endif /* CONFIG_MX_CYCLIC */
|
|
|
|