HI Sughosh,

On Fri, 7 Jun 2024 at 12:53, Sughosh Ganu <sughosh.g...@linaro.org> wrote:
>
> The current LMB API's for allocating and reserving memory use a
> per-caller based memory view. Memory allocated by a caller can then be
> overwritten by another caller. Make these allocations and reservations
> persistent. With this, memory allocated or reserved will not be
> overwritten.
>
> Signed-off-by: Sughosh Ganu <sughosh.g...@linaro.org>
> ---
>
> Note: @Mark Kettenis, please review the changes made in the apple dart
> driver. I have removed the driver-local LMB instance, but I am not
> sure if the current logic makes sense. I would think that it would be
> possible to simply use memory region allocated by the LMB module(maybe
> using the max address argument), instead of adding specific memory
> region with lmb_add().
>
>  arch/arm/mach-stm32mp/dram_init.c |  1 -
>  board/xilinx/common/board.c       |  1 -
>  drivers/iommu/apple_dart.c        |  1 -
>  drivers/iommu/sandbox_iommu.c     |  1 -
>  include/lmb.h                     | 17 ++----
>  lib/lmb.c                         | 91 ++++++++++++++++---------------
>  test/lib/lmb.c                    | 18 ------
>  7 files changed, 50 insertions(+), 80 deletions(-)
>
> diff --git a/arch/arm/mach-stm32mp/dram_init.c 
> b/arch/arm/mach-stm32mp/dram_init.c
> index fb1208fc5d..86d6577b35 100644
> --- a/arch/arm/mach-stm32mp/dram_init.c
> +++ b/arch/arm/mach-stm32mp/dram_init.c
> @@ -59,7 +59,6 @@ phys_addr_t board_get_usable_ram_top(phys_size_t total_size)
>         gd->ram_top = clamp_val(gd->ram_top, 0, SZ_4G - 1);
>
>         /* found enough not-reserved memory to relocated U-Boot */
> -       lmb_init(&lmb);
>         lmb_add(&lmb, gd->ram_base, gd->ram_top - gd->ram_base);
>         boot_fdt_add_mem_rsv_regions(&lmb, (void *)gd->fdt_blob);
>         /* add 8M for reserved memory for display, fdt, gd,... */
> diff --git a/board/xilinx/common/board.c b/board/xilinx/common/board.c
> index b47d2d23f9..ebe57da7f8 100644
> --- a/board/xilinx/common/board.c
> +++ b/board/xilinx/common/board.c
> @@ -685,7 +685,6 @@ phys_addr_t board_get_usable_ram_top(phys_size_t 
> total_size)
>                 panic("Not 64bit aligned DT location: %p\n", gd->fdt_blob);
>
>         /* found enough not-reserved memory to relocated U-Boot */
> -       lmb_init(&lmb);
>         lmb_add(&lmb, gd->ram_base, gd->ram_size);
>         boot_fdt_add_mem_rsv_regions(&lmb, (void *)gd->fdt_blob);
>         size = ALIGN(CONFIG_SYS_MALLOC_LEN + total_size, MMU_SECTION_SIZE);
> diff --git a/drivers/iommu/apple_dart.c b/drivers/iommu/apple_dart.c
> index 6ecd84303b..ef385d9c9f 100644
> --- a/drivers/iommu/apple_dart.c
> +++ b/drivers/iommu/apple_dart.c
> @@ -214,7 +214,6 @@ static int apple_dart_probe(struct udevice *dev)
>         priv->dvabase = DART_PAGE_SIZE;
>         priv->dvaend = SZ_4G - DART_PAGE_SIZE;
>
> -       lmb_init(&priv->lmb);
>         lmb_add(&priv->lmb, priv->dvabase, priv->dvaend - priv->dvabase);
>
>         /* Disable translations. */
> diff --git a/drivers/iommu/sandbox_iommu.c b/drivers/iommu/sandbox_iommu.c
> index 6ceb7fd5ec..31ce91345c 100644
> --- a/drivers/iommu/sandbox_iommu.c
> +++ b/drivers/iommu/sandbox_iommu.c
> @@ -55,7 +55,6 @@ static int sandbox_iommu_probe(struct udevice *dev)
>  {
>         struct sandbox_iommu_priv *priv = dev_get_priv(dev);
>
> -       lmb_init(&priv->lmb);
>         lmb_add(&priv->lmb, 0x89abc000, SZ_16K);
>
>         return 0;
> diff --git a/include/lmb.h b/include/lmb.h
> index 7b87181b9e..bbe1c5299c 100644
> --- a/include/lmb.h
> +++ b/include/lmb.h
> @@ -49,8 +49,7 @@ struct lmb_property {
>   *         => CONFIG_LMB_MEMORY_REGIONS: struct lmb.memory_regions
>   *         => CONFIG_LMB_RESERVED_REGIONS: struct lmb.reserved_regions
>   *         lmb_region.region is only a pointer to the correct buffer,
> - *         initialized in lmb_init(). This configuration is useful to manage
> - *         more reserved memory regions with CONFIG_LMB_RESERVED_REGIONS.
> + *         initialized with these values.
>   */
>
>  /**
> @@ -73,26 +72,18 @@ struct lmb_region {
>  /**
>   * struct lmb - Logical memory block handle.
>   *
> - * Clients provide storage for Logical memory block (lmb) handles.
> - * The content of the structure is managed by the lmb library.
> - * A lmb struct is  initialized by lmb_init() functions.
> - * The lmb struct is passed to all other lmb APIs.
> + * The Logical Memory Block structure which is used to keep track
> + * of available memory which can be used for stuff like loading
> + * images(kernel, initrd, fdt).
>   *
>   * @memory: Description of memory regions.
>   * @reserved: Description of reserved regions.
> - * @memory_regions: Array of the memory regions (statically allocated)
> - * @reserved_regions: Array of the reserved regions (statically allocated)
>   */
>  struct lmb {
>         struct lmb_region memory;
>         struct lmb_region reserved;
> -#if !IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
> -       struct lmb_property memory_regions[CONFIG_LMB_MEMORY_REGIONS];
> -       struct lmb_property reserved_regions[CONFIG_LMB_RESERVED_REGIONS];
> -#endif
>  };
>
> -void lmb_init(struct lmb *lmb);
>  void lmb_init_and_reserve(struct lmb *lmb, struct bd_info *bd, void 
> *fdt_blob);
>  void lmb_init_and_reserve_range(struct lmb *lmb, phys_addr_t base,
>                                 phys_size_t size, void *fdt_blob);
> diff --git a/lib/lmb.c b/lib/lmb.c
> index 4d39c0d1f9..7f34d4a8b0 100644
> --- a/lib/lmb.c
> +++ b/lib/lmb.c
> @@ -20,6 +20,25 @@ DECLARE_GLOBAL_DATA_PTR;
>
>  #define LMB_ALLOC_ANYWHERE     0
>
> +#if !IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
> +struct lmb_property memory_regions[CONFIG_LMB_MEMORY_REGIONS];
> +struct lmb_property reserved_regions[CONFIG_LMB_RESERVED_REGIONS];
> +#endif
> +
> +struct lmb lmb = {
> +#if IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
> +       .memory.max = CONFIG_LMB_MAX_REGIONS,
> +       .reserved.max = CONFIG_LMB_MAX_REGIONS,
> +#else
> +       .memory.max = CONFIG_LMB_MEMORY_REGIONS,
> +       .reserved.max = CONFIG_LMB_RESERVED_REGIONS,
> +       .memory.region = memory_regions,
> +       .reserved.region = reserved_regions,
> +#endif
> +       .memory.cnt = 0,
> +       .reserved.cnt = 0,
> +};

Please use a pointer in global_data, so we can handle tests.

Also for bootstd we likely want to create a new one and 'own
everything'. I haven't thought it through fully, though.

Regards,
Simon

Reply via email to