[PATCH v1] lmb: Optionally limit available memory to 4 GiB on limited systems

Ilias Apalodimas ilias.apalodimas at linaro.org
Thu Jun 4 08:43:43 CEST 2026


On Wed, 3 Jun 2026 at 17:18, Marek Vasut
<marek.vasut+renesas at mailbox.org> wrote:
>
> 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
> ---
> V1: Invert the IS_ENABLED(CONFIG_LMB_LIMIT_DMA_BELOW_4G) conditional
> ---

Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
Tested-by: Ilias Apalodimas <ilias.apalodimas at linaro.org> #rpi4 8GiB

>  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..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);
> +               }
>         }
>  }
>
> --
> 2.53.0
>


More information about the U-Boot mailing list