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.k...@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot