[PATCH] [RFC] lmb: Optionally limit available memory to 4 GiB on limited systems
Marek Vasut
marek.vasut+renesas at mailbox.org
Sat May 30 16:45:45 CEST 2026
Some architectures can not DMA above 4 GiB boundary,
limit available memory to memory below 4 GiB boundary.
Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
---
Cc: Andrew Goodbody <andrew.goodbody at linaro.org>
Cc: David Lechner <dlechner at baylibre.com>
Cc: Heiko Schocher <hs at nabladev.com>
Cc: Heinrich Schuchardt <xypron.glpk at gmx.de>
Cc: Holger Brunck <holger.brunck at hitachienergy.com>
Cc: Ilias Apalodimas <ilias.apalodimas at linaro.org>
Cc: Peter Robinson <pbrobinson at gmail.com>
Cc: Quentin Schulz <quentin.schulz at cherry.de>
Cc: Simon Glass <sjg at chromium.org>
Cc: Sughosh Ganu <sughosh.ganu at arm.com>
Cc: Tom Rini <trini at konsulko.com>
Cc: u-boot at lists.denx.de
---
lib/Kconfig | 8 ++++++++
lib/lmb.c | 20 +++++++++++++++++++-
2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/lib/Kconfig b/lib/Kconfig
index 77ebc79e1db..29911068a69 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -1295,6 +1295,14 @@ config SPL_LMB_ARCH_MEM_MAP
memory map. Enable this config in such scenarios which allow
architectures and boards to define their own memory map.
+config LMB_LIMIT_DMA_BELOW_4G
+ bool
+ depends on LMB
+ default y if ARCH_BCM283X
+ help
+ Some architectures can not DMA above 4 GiB boundary,
+ limit available memory to memory below 4 GiB boundary.
+
config PHANDLE_CHECK_SEQ
bool "Enable phandle check while getting sequence number"
help
diff --git a/lib/lmb.c b/lib/lmb.c
index 8f12c6ad8e5..a8a988eedc0 100644
--- a/lib/lmb.c
+++ b/lib/lmb.c
@@ -611,6 +611,7 @@ static __maybe_unused void lmb_reserve_common_spl(void)
static void lmb_add_memory(void)
{
int i;
+ phys_addr_t bank_end;
phys_size_t size;
u64 ram_top = gd->ram_top;
struct bd_info *bd = gd->bd;
@@ -625,8 +626,25 @@ static void lmb_add_memory(void)
for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
size = bd->bi_dram[i].size;
- if (size)
+ if (size) {
lmb_add(bd->bi_dram[i].start, size);
+ if (IS_ENABLED(CONFIG_LMB_LIMIT_DMA_BELOW_4G))
+ continue;
+
+ bank_end = bd->bi_dram[i].start + size;
+
+ /*
+ * Reserve memory above ram_top as
+ * no-overwrite so that it cannot be
+ * allocated
+ */
+ if (bd->bi_dram[i].start >= ram_top)
+ lmb_reserve(bd->bi_dram[i].start, size,
+ LMB_NOOVERWRITE);
+ else if (bank_end > ram_top)
+ lmb_reserve(ram_top, bank_end - ram_top,
+ LMB_NOOVERWRITE);
+ }
}
}
--
2.53.0
More information about the U-Boot
mailing list