[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