[PATCH v2 6/6] common: Add an option to relocate on ram top
Ilias Apalodimas
ilias.apalodimas at linaro.org
Mon Apr 27 08:20:51 CEST 2026
Hi Marek,
On Sun, 26 Apr 2026 at 19:35, Marek Vasut <marek.vasut at mailbox.org> wrote:
>
> On 4/16/26 7:59 AM, Ilias Apalodimas wrote:
> > Right now we only relocate u-boot to the top of the first
> > memory bank unless the board specific code overwrites it.
> > This is problematic when loading big binaries as it
> > fragments the contiguous memory space for no apparent reason.
> >
> > It's worth noting that there are cases where we must not relocate
> > above the 4GiB boundary (64bit hardware with 32bit only capable
> > DMA). E.g This will break platforms, if the ethernet
> > controller cannot DMA above 4 GiB, and once U-Boot does
> > get relocated above 4 GiB, the packet buffer which is built
> > into the U-Boot binary is also relocated above 4 GiB.
>
> On certain platforms, it is currently not possible to relocate U-Boot
> above the 32bit boundary, due to various dependencies on content located
> below the 32bit boundary. One such example is ethernet, where the packet
> buffer built into U-Boot binary is placed below the 32bit boundary and
> allows loading of data via ethernet even above 32bit boundary due to
> memory copy from the packet buffer to the destination location.
>
> > A previous patch moves the bi_dram[] info from bd to gd and make
> > the memory bank information available early. So move the
> > dram_init_banksize() INITCALL before the relocation address calculation
> > and use it to derive the address.
> >
> > Also add a Kconfig option and allow the common code to relocate U-Boot
> > to the top of the last discovered bank.
> >
[...]
>
> > +
> > endif # EXPERT
> >
> > config PHYS_64BIT
> > diff --git a/common/board_f.c b/common/board_f.c
> > index 4ac22dca9e7c..f95e789257ad 100644
> > --- a/common/board_f.c
> > +++ b/common/board_f.c
> > @@ -339,7 +339,22 @@ static int setup_ram_base(void)
> > static int setup_ram_config(void)
> > {
> > debug("Monitor len: %08x\n", gd->mon_len);
> > -#if CONFIG_VAL(SYS_MEM_TOP_HIDE)
> > +
> > + if (CONFIG_IS_ENABLED(RELOC_ADDR_TOP)) {
> > + int bank;
> > + phys_size_t total_size = 0;
> > +
> > + for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
> > + if (gd->ram_top <= gd->bi_dram[bank].start)
> > + gd->ram_top = gd->bi_dram[bank].start +
> > + gd->bi_dram[bank].size;
> > + total_size += gd->bi_dram[bank].size;
> > + }
> > + gd->ram_size = total_size;
>
> Shouldn't this also apply board_get_usable_ram_top() to be consistent ?
Simon asked the same thing. I'd rather keep this option strict for now
and always relocate to the upper memory boundary fnor now. Once I do
further cleanups, I can either add it or remove the function entirely
since dram_init_banksize() (which hs also board specific) runs really
early now.
>
> > + } else {
> > + gd->ram_top = gd->ram_base + get_effective_memsize();
> > + gd->ram_top = board_get_usable_ram_top(gd->mon_len);
>
> Should this really use gd->mon_len as a parameter, or gd->ram_top?
I haven't really thought about thism since it's what we currently do.
In any case that's a change that needs to go on another patch.
>
> [...]
More information about the U-Boot
mailing list