summaryrefslogtreecommitdiff
path: root/doc/develop
diff options
context:
space:
mode:
authorTom Rini <[email protected]>2026-06-24 15:39:29 -0600
committerTom Rini <[email protected]>2026-06-24 18:13:25 -0600
commit19eafbadf20f56c1a24abe6b5e8774e776894261 (patch)
tree1ece0528f796fb129f2a7d6b18cf14db130b1150 /doc/develop
parent47e9c542ee032e89f556adc73c2aeff3acb0e5a9 (diff)
parentfb537c85bca0e3d29a62fe119181bf1744b8c91a (diff)
Merge patch series "Relocate U-Boot in the last bank"
Ilias Apalodimas <[email protected]> says: There was a discussion recently on the mailing lists regarding our management of memory above ram_top [0]. The tl;dr is that we have two problems. The first one is that U-Boot always relocates to the top of the first available bank unless there's special board code to sidestep that. The second is we don't successfully deal with devices that can only do 32-bit DMA. This patch series deals with the first problem by adding a Kconfig option allowing platforms to relocate to the top of the last discovered bank. It's worth noting that this is easily testable with QEMU qemu-system-aarch64 -m 8192 -smp 2 -nographic -cpu cortex-a57 \ -machine virt,secure=off \ -bios u-boot.bin \ -device virtio-rng-pci \ -drive id=os,if=none,file="$image" \ -device virtio-blk-device,drive=os \ -object memory-backend-ram,id=ram0,size=4G \ -object memory-backend-ram,id=ram1,size=4G \ -numa node,memdev=ram0 \ -numa node,memdev=ram1 # RELOC_ADDR_TOP not set Hit any key to stop autoboot: 0 => bdinfo [...] relocaddr = 0x000000013f66c000 reloc off = 0x000000013f66c000 [...] lmb_dump_all: memory.count = 0x1 memory[0] [0x40000000-0x23fffffff], 0x200000000 bytes, flags: none reserved.count = 0x2 reserved[0] [0x13d507000-0x13d509fff], 0x3000 bytes, flags: no-notify, no-overwrite reserved[1] [0x13d50aff0-0x23fffffff], 0x102af5010 bytes, flags: no-overwrite devicetree = board [...] TLB addr = 0x000000013ffe0000 irq_sp = 0x000000013e50aff0 sp start = 0x000000013e50aff0 Early malloc usage: e88 / 2000 => # RELOC_ADDR_TOP enabled => bdinfo [...] relocaddr = 0x000000023f66c000 reloc off = 0x000000023f66c000 [...] lmb_dump_all: memory.count = 0x1 memory[0] [0x40000000-0x23fffffff], 0x200000000 bytes, flags: none reserved.count = 0x2 reserved[0] [0x23d507000-0x23d509fff], 0x3000 bytes, flags: no-notify, no-overwrite reserved[1] [0x23d50aff0-0x23fffffff], 0x2af5010 bytes, flags: no-overwrite devicetree = board [...] TLB addr = 0x000000023ffe0000 irq_sp = 0x000000023e50aff0 sp start = 0x000000023e50aff0 Early malloc usage: e88 / 2000 => [0] https://lore.kernel.org/u-boot/CAC_iWjKFAzpj3B_MEW7-dnOrcAV-rfkhXXo8Bv0KgLNP2VJxRA@mail.gmail.com/ Link: https://lore.kernel.org/r/[email protected]
Diffstat (limited to 'doc/develop')
-rw-r--r--doc/develop/memory.rst9
1 files changed, 9 insertions, 0 deletions
diff --git a/doc/develop/memory.rst b/doc/develop/memory.rst
index 5177229630d..3da39bb6c66 100644
--- a/doc/develop/memory.rst
+++ b/doc/develop/memory.rst
@@ -111,6 +111,15 @@ U-Boot Proper Flow
This follows the same as in SPL flow. In board_init_f(), a part of memory
is reserved at the end of RAM (see reserve_* functions in init_sequence_f)
+ #. Relocation address
+
+ By default U-Boot will try to relocate below the 4GiB boundary. If
+ RELOC_ADDR_TOP is enabled U-Boot will look into the dram bank config of
+ gd->dram[] and try to relocate to the highest available bank. Use this
+ with caution as devices that can only DMA below 4GiB will misbehave
+ since their buffers may be allocated above the 32-bit boundary.
+ Boards can override thre relocation address via board_get_usable_ram_top().
+
#. Code Relocation
relocate_code() is called which relocates U-Boot code from the current