[PATCH 2/5] lmb: replace the lmb_alloc() and lmb_alloc_base() API's
Ilias Apalodimas
ilias.apalodimas at linaro.org
Fri May 2 09:41:41 CEST 2025
On Thu May 1, 2025 at 3:02 PM EEST, Sughosh Ganu wrote:
> There currently are two API's for requesting memory from the LMB
> module, lmb_alloc() and lmb_alloc_base(). The function which does the
> actual allocation is the same. Use the earlier introduced API
> lmb_allocate_mem() for both types of allocation requests.
>
> Signed-off-by: Sughosh Ganu <sughosh.ganu at linaro.org>
> ---
> arch/arm/mach-apple/board.c | 27 ++++++++++++++-----
> arch/arm/mach-snapdragon/board.c | 13 ++++++++-
> boot/bootm.c | 6 +++--
> boot/image-board.c | 45 ++++++++++++++++++--------------
> boot/image-fdt.c | 32 +++++++++++++++++------
> include/lmb.h | 22 +++-------------
> lib/efi_loader/efi_memory.c | 14 +++++-----
> lib/lmb.c | 30 ++++++++++-----------
> test/lib/lmb.c | 26 ++++++++++++++++++
> 9 files changed, 138 insertions(+), 77 deletions(-)
>
> diff --git a/arch/arm/mach-apple/board.c b/arch/arm/mach-apple/board.c
> index 2644a04a622..f0eab5df1ef 100644
> --- a/arch/arm/mach-apple/board.c
> +++ b/arch/arm/mach-apple/board.c
> @@ -772,6 +772,19 @@ u64 get_page_table_size(void)
>
> #define KERNEL_COMP_SIZE SZ_128M
>
> +static phys_addr_t lmb_alloc(phys_size_t size)
> +{
> + int ret;
> + phys_addr_t addr;
> +
> + /* All memory regions allocated with a 2MiB alignment */
> + ret = lmb_allocate_mem(LMB_MEM_ALLOC_ANY, SZ_2M, &addr, size, LMB_NONE);
> + if (ret)
> + return 0;
> +
> + return addr;
> +}
> +
> int board_late_init(void)
> {
> u32 status = 0;
> @@ -779,15 +792,15 @@ int board_late_init(void)
> /* somewhat based on the Linux Kernel boot requirements:
> * align by 2M and maximal FDT size 2M
> */
> - status |= env_set_hex("loadaddr", lmb_alloc(SZ_1G, SZ_2M));
> - status |= env_set_hex("fdt_addr_r", lmb_alloc(SZ_2M, SZ_2M));
> - status |= env_set_hex("kernel_addr_r", lmb_alloc(SZ_128M, SZ_2M));
> - status |= env_set_hex("ramdisk_addr_r", lmb_alloc(SZ_1G, SZ_2M));
> + status |= env_set_hex("loadaddr", lmb_alloc(SZ_1G));
env_set_hex() expects a ulong, which might end up causing problems for some archs, but I don't think
that's a problem of this patchset. It's something that has to be fixed in a the wider codebase
> + status |= env_set_hex("fdt_addr_r", lmb_alloc(SZ_2M));
> + status |= env_set_hex("kernel_addr_r", lmb_alloc(SZ_128M));
> rd_len, LMB_NONE);
> } else {
> if (initrd_high)
> - *initrd_start =
> - (ulong)lmb_alloc_base(rd_len,
> - 0x1000,
> - initrd_high,
> - LMB_NONE);
> + err = lmb_allocate_mem(LMB_MEM_ALLOC_MAX,
> + 0x1000, &initrd_high,
> + rd_len, LMB_NONE);
> else
> - *initrd_start = (ulong)lmb_alloc(rd_len,
> - 0x1000);
> + err = lmb_allocate_mem(LMB_MEM_ALLOC_ANY,
> + 0x1000, &initrd_high,
> + rd_len, LMB_NONE);
You are now calling the same function, put LMB_MEM_ALLOC_ANY/LMB_MEM_ALLOC_MAX in a variable instead
and make the if smaller
[...]
> diff --git a/boot/image-fdt.c b/boot/image-fdt.c
> index 6585813de00..b8e1b0f35bb 100644
> --- a/boot/image-fdt.c
> +++ b/boot/image-fdt.c
> @@ -198,15 +198,27 @@ int boot_relocate_fdt(char **of_flat_tree, ulong *of_size)
> of_start = (void *)(uintptr_t)addr;
> disable_relocation = 1;
> } else if (desired_addr) {
> - addr = lmb_alloc_base(of_len, 0x1000, desired_addr,
> - LMB_NONE);
> + addr = desired_addr;
> + err = lmb_allocate_mem(LMB_MEM_ALLOC_MAX, 0x1000, &addr,
Is this LMB_MEM_ALLOC_MAX or LMB_MEM_ALLOC_ADDR?
> + of_len, LMB_NONE);
> +
> + if (err) {
> + puts("Failed using fdt_high value for Device Tree");
> + goto error;
> + }
> +
> of_start = map_sysmem(addr, of_len);
> } else {
> @@ -228,11 +240,15 @@ int boot_relocate_fdt(char **of_flat_tree, ulong *of_size)
>
> switch (type) {
> + case LMB_MEM_ALLOC_ANY:
> + *addr = LMB_ALLOC_ANYWHERE;
> + ret = _lmb_alloc_base(size, align, addr, flags);
> + break;
> + case LMB_MEM_ALLOC_MAX:
> + ret = _lmb_alloc_base(size, align, addr, flags);
> + break;
You can make this a fallthrough
case LMB_MEM_ALLOC_ANY:
*addr = LMB_ALLOC_ANYWHERE;
case LMB_MEM_ALLOC_MAX:
ret = _lmb_alloc_base(size, align, addr, flags);
break;
> case LMB_MEM_ALLOC_ADDR:
> ret = _lmb_alloc_addr(*addr, size, flags);
> break;
> diff --git a/test/lib/lmb.c b/test/lib/lmb.c
> index f80115570e7..8ce19efc854 100644
> --- a/test/lib/lmb.c
> +++ b/test/lib/lmb.c
> @@ -82,6 +82,32 @@ static int lmb_reserve(phys_addr_t addr, phys_size_t size, u32 flags)
> return 0;
> }
>
> +static phys_addr_t lmb_alloc(phys_size_t size, ulong align)
> +{
> + int err;
> + phys_addr_t addr;
> +
> + err = lmb_allocate_mem(LMB_MEM_ALLOC_ANY, align, &addr, size, LMB_NONE);
> + if (err)
> + return 0;
> +
> + return addr;
> +}
> +
> +static phys_addr_t lmb_alloc_base(phys_size_t size, ulong align,
> + phys_addr_t max_addr, u32 flags)
> +{
> + int err;
> + phys_addr_t addr;
> +
> + addr = max_addr;
> + err = lmb_allocate_mem(LMB_MEM_ALLOC_MAX, align, &addr, size, flags);
> + if (err)
> + return 0;
> +
> + return addr;
> +}
> +
> #define lmb_alloc_addr(addr, size, flags) lmb_reserve(addr, size, flags)
>
> static int test_multi_alloc(struct unit_test_state *uts, const phys_addr_t ram,
Thanks
/Ilias
More information about the U-Boot
mailing list