[PATCH 01/16] lmb: add versions of the lmb API with flags

Sughosh Ganu sughosh.ganu at linaro.org
Tue Sep 17 13:47:39 CEST 2024


On Sat, 14 Sept 2024 at 20:01, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
> On 9/5/24 10:27, Sughosh Ganu wrote:
> > The LMB module is to be used as a backend for allocating and freeing
> > up memory requested from other modules like EFI. These memory requests
> > are different from the typical LMB reservations in that memory
> > required by the EFI module cannot be overwritten, or re-requested. Add
> > versions of the LMB API functions with flags for allocating and
> > freeing up memory. The caller can then use these API's for specifying
> > the type of memory that is required. For now, these functions will be
> > used by the EFI memory module.
> >
> > Signed-off-by: Sughosh Ganu <sughosh.ganu at linaro.org>
> > ---
> >   include/lmb.h |  6 ++++++
> >   lib/lmb.c     | 39 ++++++++++++++++++++++++++++++++++++++-
> >   2 files changed, 44 insertions(+), 1 deletion(-)
> >
> > diff --git a/include/lmb.h b/include/lmb.h
> > index fc2daaa7bf..45a06c3b99 100644
> > --- a/include/lmb.h
> > +++ b/include/lmb.h
> > @@ -86,8 +86,13 @@ long lmb_reserve(phys_addr_t base, phys_size_t size);
> >   long lmb_reserve_flags(phys_addr_t base, phys_size_t size,
> >                      enum lmb_flags flags);
> >   phys_addr_t lmb_alloc(phys_size_t size, ulong align);
> > +phys_addr_t lmb_alloc_flags(phys_size_t size, ulong align, uint flags);
>
> Please, provide Sphinx style function descriptions for the functions
> that you are adding or changing.

Will do. Thanks.

-sughosh

>
> Cf.
> https://www.kernel.org/doc/html/latest/doc-guide/kernel-doc.html#function-documentation
>
> Best regards
>
> Heinrich
>
> >   phys_addr_t lmb_alloc_base(phys_size_t size, ulong align, phys_addr_t max_addr);
> > +phys_addr_t lmb_alloc_base_flags(phys_size_t size, ulong align,
> > +                              phys_addr_t max_addr, uint flags);
> >   phys_addr_t lmb_alloc_addr(phys_addr_t base, phys_size_t size);
> > +phys_addr_t lmb_alloc_addr_flags(phys_addr_t base, phys_size_t size,
> > +                              uint flags);
> >   phys_size_t lmb_get_free_size(phys_addr_t addr);
> >
> >   /**
> > @@ -103,6 +108,7 @@ phys_size_t lmb_get_free_size(phys_addr_t addr);
> >   int lmb_is_reserved_flags(phys_addr_t addr, int flags);
> >
> >   long lmb_free(phys_addr_t base, phys_size_t size);
> > +long lmb_free_flags(phys_addr_t base, phys_size_t size, uint flags);
> >
> >   void lmb_dump_all(void);
> >   void lmb_dump_all_force(void);
> > diff --git a/lib/lmb.c b/lib/lmb.c
> > index 3ed570fb29..da6a1595cc 100644
> > --- a/lib/lmb.c
> > +++ b/lib/lmb.c
> > @@ -479,7 +479,7 @@ long lmb_add(phys_addr_t base, phys_size_t size)
> >       return lmb_add_region(lmb_rgn_lst, base, size);
> >   }
> >
> > -long lmb_free(phys_addr_t base, phys_size_t size)
> > +static long __lmb_free(phys_addr_t base, phys_size_t size)
> >   {
> >       struct lmb_region *rgn;
> >       struct alist *lmb_rgn_lst = &lmb.used_mem;
> > @@ -530,6 +530,17 @@ long lmb_free(phys_addr_t base, phys_size_t size)
> >                                   rgn[i].flags);
> >   }
> >
> > +long lmb_free(phys_addr_t base, phys_size_t size)
> > +{
> > +     return __lmb_free(base, size);
> > +}
> > +
> > +long lmb_free_flags(phys_addr_t base, phys_size_t size,
> > +                 __always_unused uint flags)
> > +{
> > +     return __lmb_free(base, size);
> > +}
> > +
> >   long lmb_reserve_flags(phys_addr_t base, phys_size_t size, enum lmb_flags flags)
> >   {
> >       struct alist *lmb_rgn_lst = &lmb.used_mem;
> > @@ -613,6 +624,12 @@ phys_addr_t lmb_alloc(phys_size_t size, ulong align)
> >       return lmb_alloc_base(size, align, LMB_ALLOC_ANYWHERE);
> >   }
> >
> > +phys_addr_t lmb_alloc_flags(phys_size_t size, ulong align, uint flags)
> > +{
> > +     return __lmb_alloc_base(size, align, LMB_ALLOC_ANYWHERE,
> > +                             flags);
> > +}
> > +
> >   phys_addr_t lmb_alloc_base(phys_size_t size, ulong align, phys_addr_t max_addr)
> >   {
> >       phys_addr_t alloc;
> > @@ -626,6 +643,20 @@ phys_addr_t lmb_alloc_base(phys_size_t size, ulong align, phys_addr_t max_addr)
> >       return alloc;
> >   }
> >
> > +phys_addr_t lmb_alloc_base_flags(phys_size_t size, ulong align,
> > +                              phys_addr_t max_addr, uint flags)
> > +{
> > +     phys_addr_t alloc;
> > +
> > +     alloc = __lmb_alloc_base(size, align, max_addr, flags);
> > +
> > +     if (alloc == 0)
> > +             printf("ERROR: Failed to allocate 0x%lx bytes below 0x%lx.\n",
> > +                    (ulong)size, (ulong)max_addr);
> > +
> > +     return alloc;
> > +}
> > +
> >   static phys_addr_t __lmb_alloc_addr(phys_addr_t base, phys_size_t size,
> >                                   enum lmb_flags flags)
> >   {
> > @@ -660,6 +691,12 @@ phys_addr_t lmb_alloc_addr(phys_addr_t base, phys_size_t size)
> >       return __lmb_alloc_addr(base, size, LMB_NONE);
> >   }
> >
> > +phys_addr_t lmb_alloc_addr_flags(phys_addr_t base, phys_size_t size,
> > +                              uint flags)
> > +{
> > +     return __lmb_alloc_addr(base, size, flags);
> > +}
> > +
> >   /* Return number of bytes from a given address that are free */
> >   phys_size_t lmb_get_free_size(phys_addr_t addr)
> >   {
>


More information about the U-Boot mailing list