summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMarek Vasut <[email protected]>2026-06-03 16:17:55 +0200
committerTom Rini <[email protected]>2026-06-04 08:26:41 -0600
commitaf4aad1f0a0beba82d2015d79b450b59bf34d2bc (patch)
tree07504357be5476d8d334c80476cf144cc9c3598d /lib
parent4065ee552b8e975e73b90c5b57f00af6ca0c5d65 (diff)
lmb: Optionally limit available memory to 4 GiB on limited systems
Some architectures can not DMA above 4 GiB boundary, limit available memory to memory below 4 GiB boundary. Signed-off-by: Marek Vasut <[email protected]> Reviewed-by: Ilias Apalodimas <[email protected]> Tested-by: Ilias Apalodimas <[email protected]> #rpi4 8GiB
Diffstat (limited to 'lib')
-rw-r--r--lib/Kconfig8
-rw-r--r--lib/lmb.c20
2 files changed, 27 insertions, 1 deletions
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..a2aeb526e29 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);
+ }
}
}