[U-Boot] valid RAM region on a 256MB fails occasionally
harsha kiran
kj.h.kiran at us.abb.com
Fri Aug 28 00:15:41 CEST 2015
Hi !
I am trying to run a u-boot.bin from the RAM as a standalone application and
occationally my board hangs and resets. i found the place it breaks but dont
have any clue why..
After the u-boot.img is loaded, i get the cmd prompt and run run the
u-boot.bin from by boot partition of emmc
U-Boot# fatload mmc 1:1 0x84000000 u-boot.bin
reading u-boot.bin
388959 bytes read in 44 ms (8.4 MiB/s)
U-Boot# go 0x84000000
## Starting application at 0x84000000 ...
Here the u-boot.bin starts and runs fine most of the time. occationally i
get the following and system hangs and resets.
RAM Configuration:
Bank #0: 80000000
DRAM: 1 GiB
I have a 256M lpDDR Ram on our custom board and for some reason u-boot
calculates the wrong (1Gb) on the bad cases..
Here is the file it reports the calculated RAM size..
u-boot-2015.07/common/memsize.c.
I added some debug prints and here are the outputs for a valid case and
occational bad reset..
function modified:
---------------------
long get_ram_size(long *base, long maxsize)
{
volatile long *addr;
long save[32];
long cnt;
long val;
long size;
int i = 0;
printf("The value of base is %ld and max value is %ld and size of long is
%d \n", *base, maxsize, sizeof(long));
for (cnt = (maxsize / sizeof(long)) >> 1; cnt > 0; cnt >>= 1) {
addr = base + cnt; /* pointer arith! */
printf("address= %ld ", *addr);
sync();
save[i++] = *addr;
printf("save[%d]=%ld \n", i, *addr);
sync();
*addr = ~cnt;
}
printf("The address val is %ld ", *addr);
addr = base;
sync();
save[i] = *addr;
sync();
*addr = 0;
printf("save[%d]=%ld \n", i, *addr);
sync();
if ((val = *addr) != 0) {
/* Restore the original data before leaving the function. */
puts(" The value of addr is 0 \n");
sync();
*addr = save[i];
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
addr = base + cnt;
sync();
*addr = save[--i];
}
puts("Returning zero size !!!");
return (0);
}
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
addr = base + cnt; /* pointer arith! */
val = *addr;
*addr = save[--i];
printf("base=%ld , val=%ld , address,save[%d]=%ld, cnt=%ld and ~cnt=%ld
\n",*base, val,i,*addr,cnt,~cnt);
if (val != ~cnt) {
size = cnt * sizeof(long);
printf("calulated size is %ld \n!!!!", size);
/*
* Restore the original data
* before leaving the function.
*/
for (cnt <<= 1;
cnt < maxsize / sizeof(long);
cnt <<= 1) {
addr = base + cnt;
*addr = save[--i];
}
printf("returning cal size %ld \n!!!!", size);
return (size);
}
}
puts("returning max size!!!!");
return (maxsize);
}
Bad Case:
----------------
<http://u-boot.10912.n7.nabble.com/file/n226040/bad.jpg>
Good Case:
--------------
<http://u-boot.10912.n7.nabble.com/file/n226040/good.jpg>
I get a value even after the valid RAM range and this happens randomly..
I have caches enabled in both the u-boot.img and u-boot.bin. please let me
know if i am missing anything..
Thanks,
Harsha
--
View this message in context: http://u-boot.10912.n7.nabble.com/valid-RAM-region-on-a-256MB-fails-occasionally-tp226040.html
Sent from the U-Boot mailing list archive at Nabble.com.
More information about the U-Boot
mailing list