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]> --- Cc: Andrew Goodbody <[email protected]> Cc: David Lechner <[email protected]> Cc: Heiko Schocher <[email protected]> Cc: Heinrich Schuchardt <[email protected]> Cc: Holger Brunck <[email protected]> Cc: Ilias Apalodimas <[email protected]> Cc: Peter Robinson <[email protected]> Cc: Quentin Schulz <[email protected]> Cc: Simon Glass <[email protected]> Cc: Sughosh Ganu <[email protected]> Cc: Tom Rini <[email protected]> Cc: [email protected] --- 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

