[U-Boot] [PATCH] memsize: get correct memory size

Minkyu Kang mk7.kang at samsung.com
Wed Nov 18 06:02:54 CET 2009


In some case, saved address and compared address are different. (e.g: 80M)
So, it can be get wrong memory size.
This patch fix the such problem, and fix style problems also.

Signed-off-by: Minkyu Kang <mk7.kang at samsung.com>
---
 common/memsize.c |   77 +++++++++++++++++++++++++++++++++---------------------
 1 files changed, 47 insertions(+), 30 deletions(-)

diff --git a/common/memsize.c b/common/memsize.c
index 6c275c9..57c3cd7 100644
--- a/common/memsize.c
+++ b/common/memsize.c
@@ -44,51 +44,68 @@ long get_ram_size(volatile long *base, long maxsize)
 	long           cnt;
 	long           val;
 	long           size;
+	long           max = maxsize / sizeof(long);
 	int            i = 0;
 
-	for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+	for (cnt = 1; cnt < max; cnt <<= 1) {
 		addr = base + cnt;	/* pointer arith! */
-		sync ();
-		save[i++] = *addr;
-		sync ();
+		sync();
+		save[++i] = *addr;
+		sync();
 		*addr = ~cnt;
 	}
 
+	addr = base + max - 1;
+	sync();
+	save[++i] = *addr;
+	sync();
+	*addr = ~max;
+
 	addr = base;
-	sync ();
-	save[i] = *addr;
-	sync ();
+	sync();
+	save[0] = *addr;
+	sync();
 	*addr = 0;
+	sync();
 
-	sync ();
-	if ((val = *addr) != 0) {
-		/* Restore the original data before leaving the function.
-		 */
-		sync ();
-		*addr = save[i];
-		for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
-			addr  = base + cnt;
-			sync ();
-			*addr = save[--i];
-		}
-		return (0);
+	val = *addr;
+	if (val != 0) {
+		i = 0;
+		cnt = 1;
+		size = 0;
+		goto restore;
 	}
 
-	for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+	i = 0;
+	for (cnt = 1; cnt < max; cnt <<= 1) {
 		addr = base + cnt;	/* pointer arith! */
 		val = *addr;
-		*addr = save[--i];
+		*addr = save[++i];
 		if (val != ~cnt) {
-			size = cnt * sizeof (long);
-			/* Restore the original data before leaving the function.
-			 */
-			for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
-				addr  = base + cnt;
-				*addr = save[--i];
-			}
-			return (size);
+			size = cnt * sizeof(long);
+			cnt <<= 1;
+			goto restore;
 		}
 	}
 
-	return (maxsize);
+	addr = base + max - 1;
+	val = *addr;
+	*addr = save[++i];
+	if (val != ~max)
+		maxsize = (cnt >> 1) * sizeof(long);
+
+	return maxsize;
+
+restore:
+	/* Restore the original data before leaving the function. */
+	for (; cnt < max; cnt <<= 1) {
+		addr = base + cnt;
+		sync();
+		*addr = save[++i];
+	}
+	addr = base;
+	sync();
+	*addr = save[0];
+
+	return size;
 }
-- 
1.5.4.3


More information about the U-Boot mailing list