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.g...@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