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

Heinrich Schuchardt xypron.glpk at gmx.de
Sat Sep 14 16:30:37 CEST 2024


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.

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