[U-Boot] [PATCH] Revert "common/memsize.c: Simplify RAM size detection"

Hans de Goede hdegoede at redhat.com
Tue Feb 9 22:38:31 CET 2016


This commit breaks bootup on sunxi boards, the get stuck
when running the main u-boot binary at:

CPU:   Allwinner H3 (SUN8I)
I2C:   ready
DRAM:

This reverts commit 8e7cba048baae68ee0916a8f52b4304277328d5e.

Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 common/memsize.c | 47 ++++++++++++++++++++++++++---------------------
 1 file changed, 26 insertions(+), 21 deletions(-)

diff --git a/common/memsize.c b/common/memsize.c
index 5c0d279..0fb9ba5 100644
--- a/common/memsize.c
+++ b/common/memsize.c
@@ -33,28 +33,38 @@ long get_ram_size(long *base, long maxsize)
 	long           size;
 	int            i = 0;
 
-	for (cnt = (maxsize / sizeof(long)) >> 1; cnt >= 0; cnt >>= 1) {
+	for (cnt = (maxsize / sizeof(long)) >> 1; cnt > 0; cnt >>= 1) {
 		addr = base + cnt;	/* pointer arith! */
 		sync();
-		save[i] = *addr;
+		save[i++] = *addr;
 		sync();
-		if (cnt) {
-			i++;
-			*addr = ~cnt;
-		} else {
-			*addr = 0;
-		}
+		*addr = ~cnt;
 	}
 
+	addr = base;
+	sync();
+	save[i] = *addr;
+	sync();
+	*addr = 0;
+
 	sync();
-	cnt = 0;
-	do {
+	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);
+	}
+
+	for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
 		addr = base + cnt;	/* pointer arith! */
 		val = *addr;
-		*addr = save[i--];
-		sync();
-		if (((cnt == 0) && (val != 0)) ||
-		    ((cnt != 0) && (val != ~cnt))) {
+		*addr = save[--i];
+		if (val != ~cnt) {
 			size = cnt * sizeof(long);
 			/*
 			 * Restore the original data
@@ -64,16 +74,11 @@ long get_ram_size(long *base, long maxsize)
 			     cnt < maxsize / sizeof(long);
 			     cnt <<= 1) {
 				addr  = base + cnt;
-				*addr = save[i--];
+				*addr = save[--i];
 			}
 			return (size);
 		}
-
-		if (cnt)
-			cnt = cnt << 1;
-		else
-			cnt = 1;
-	} while (cnt < maxsize / sizeof(long));
+	}
 
 	return (maxsize);
 }
-- 
2.5.0



More information about the U-Boot mailing list