[U-Boot] Dynamically determine RAM size and pass it to kernel
Mike Looijmans
mike.looijmans at topic.nl
Thu Nov 17 13:34:55 CET 2016
We have some Zynq based boards still in the field that have only 512MB RAM
instead of 1GB. The memory chips are compatible and use the same settings
apart from that one extra address bit.
So what works is just configure the DDR controller for 1GB and then check if
writing some data "wraps" back, this is my "spike" code in the RAM init code
for that:
+ u32 *ptr_1 = (u32*)0x10000;
+ u32 *ptr_2 = (u32*)((gd->ram_size >> 1) + 0x10000);
+
+ puts("RAM test");
+ *ptr_1 = 0x12345678;
+ if (*ptr_2 == *ptr_1) {
+ *ptr_1 = 0x87654321;
+ if (*ptr_2 == *ptr_1) {
+ puts(" [HALF]");
+ gd->ram_size >>= 1;
+ }
+ }
This works well, and reliably detects that the board only has half the amount
of RAM, and corrects the ram_size variable.
The problem I'm seeing now is that this new ram_size does not get passed to
the kernel. Apparently in modern versions of u-boot I need to somehow patch
the "live" devicetree blob as well? How does that work?
Kind regards,
Mike Looijmans
System Expert
TOPIC Products
Materiaalweg 4, NL-5681 RJ Best
Postbus 440, NL-5680 AK Best
Telefoon: +31 (0) 499 33 69 79
E-mail: mike.looijmans at topicproducts.com
Website: www.topicproducts.com
Please consider the environment before printing this e-mail
More information about the U-Boot
mailing list