[U-Boot] Dynamically determine RAM size and pass it to kernel
Mike Looijmans
mike.looijmans at topic.nl
Thu Nov 17 15:09:20 CET 2016
On 17-11-16 13:34, Mike Looijmans wrote:
> 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;
> + }
> + }
I found that I can replace that with "get_mem_size()" which does this better.
>
> 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