On Fri, 2 May 2025 at 13:11, Ilias Apalodimas
<ilias.apalodi...@linaro.org> wrote:
>
> 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

Yes, there seems to be a prevalence of using the ulong type instead of
a fixed address size type, or something like phys_addr_t, which might
be an issue with certain toolchains. But this issue has been around
for a long time now.

>
> > +     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

Will do.

>
> [...]
>
> > 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?

This is a case for LMB_MEM_ALLOC_MAX as the desired_addr variable that
is read as fdt_high has a valid value. So the allocated address should
be below desired_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;

Will change. Thanks.

-sughosh

>
> >       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

Reply via email to