@@ -1,5 +1,5 @@
/*
- * (C) Copyright 2004
+ * (C) Copyright 2004-2014
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
* SPDX-License-Identifier: GPL-2.0+
@@ -31,7 +31,7 @@ long get_ram_size(long *base, long maxsize)
long cnt;
long val;
long size;
- int i = 0;
+ int i = 0, last;
for (cnt = (maxsize / sizeof(long)) >> 1; cnt > 0; cnt >>= 1) {
addr = base + cnt; /* pointer arith! */
@@ -44,6 +44,7 @@ long get_ram_size(long *base, long maxsize)
addr = base;
sync();
save[i] = *addr;
+ last = i;
sync();
*addr = 0;
@@ -51,7 +52,7 @@ long get_ram_size(long *base, long maxsize)
if ((val = *addr) != 0) {
/* Restore the original data before leaving the function. */
sync();
- *addr = save[i];
+ *addr = save[last];
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
addr = base + cnt;
sync();
@@ -62,7 +63,9 @@ long get_ram_size(long *base, long maxsize)
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
addr = base + cnt; /* pointer arith! */
+ sync();
val = *addr;
+ sync();
*addr = save[--i];
if (val != ~cnt) {
size = cnt * sizeof(long);
@@ -74,12 +77,19 @@ long get_ram_size(long *base, long maxsize)
cnt < maxsize / sizeof(long);
cnt <<= 1) {
addr = base + cnt;
+ sync();
*addr = save[--i];
}
+ addr = base;
+ sync();
+ *addr = save[last];
return (size);
}
}
+ addr = base;
+ sync();
+ *addr = save[last];
return (maxsize);
}