diff mbox series

[RFC,03/31] lmb: make the lmb reservations persistent

Message ID 20240607185240.1892031-4-sughosh.ganu@linaro.org
State New
Headers show
Series Make U-Boot memory reservations coherent | expand

Commit Message

Sughosh Ganu June 7, 2024, 6:52 p.m. UTC
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.ganu@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(-)

Comments

Heinrich Schuchardt June 10, 2024, 11:23 a.m. UTC | #1
On 1/1/70 01:00, Ilias Apalodimas wrote:
> Hi Sughosh
>
> [...]
>
>>   #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,
>
> This is probably a good opportunity to look into why
> CONFIG_LMB_MEMORY_REGIONS was introduced.  Since we are moving towards
> static allocations, do we still need it? Or allocating the size dynamically
> covers all our cases.

Up to now we used static arrays for saving memory allocations in LMB:

include/lmb.h:67:
struct lmb_property region[CONFIG_LMB_MAX_REGIONS];

As the EFI sub-system can produce any number of non-coalescable memory
regions we should use a linked list instead.

The fields memory.max and reserved.max seem to be unused except for
test/lib/lmb.c.

lib/lmb.c:136:  lmb->memory.max = CONFIG_LMB_MAX_REGIONS;
lib/lmb.c:139:  lmb->memory.max = CONFIG_LMB_MEMORY_REGIONS;
test/lib/lmb.c:689:     ut_asserteq(lmb.memory.max, CONFIG_LMB_MAX_REGIONS);

lib/lmb.c:137:  lmb->reserved.max = CONFIG_LMB_MAX_REGIONS;
lib/lmb.c:140:  lmb->reserved.max = CONFIG_LMB_RESERVED_REGIONS;
test/lib/lmb.c:691:     ut_asserteq(lmb.reserved.max,
CONFIG_LMB_MAX_REGIONS);

Best regards

Heinrich

>
>
>> +#endif
>> +	.memory.cnt = 0,
>> +	.reserved.cnt = 0,
>> +};
>> +
>>   static void lmb_dump_region(struct lmb_region *rgn, char *name)
>>   {
>>   	unsigned long long base, size, end;
>> @@ -42,8 +61,8 @@ static void lmb_dump_region(struct lmb_region *rgn, char *name)
>>   void lmb_dump_all_force(struct lmb *lmb)
>>   {
>>   	printf("lmb_dump_all:\n");
>> -	lmb_dump_region(&lmb->memory, "memory");
>> -	lmb_dump_region(&lmb->reserved, "reserved");
>> +	lmb_dump_region(&lmb.memory, "memory");
>> +	lmb_dump_region(&lmb.reserved, "reserved");
>>   }
>>
>
> [...]
>
>
> Thanks
> /Ilias
>
Tom Rini June 10, 2024, 4:55 p.m. UTC | #2
On Mon, Jun 10, 2024 at 01:23:49PM +0200, Heinrich Schuchardt wrote:
> On 1/1/70 01:00, Ilias Apalodimas wrote:
> > Hi Sughosh
> > 
> > [...]
> > 
> > >   #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,
> > 
> > This is probably a good opportunity to look into why
> > CONFIG_LMB_MEMORY_REGIONS was introduced.  Since we are moving towards
> > static allocations, do we still need it? Or allocating the size dynamically
> > covers all our cases.
> 
> Up to now we used static arrays for saving memory allocations in LMB:
> 
> include/lmb.h:67:
> struct lmb_property region[CONFIG_LMB_MAX_REGIONS];
> 
> As the EFI sub-system can produce any number of non-coalescable memory
> regions we should use a linked list instead.

I think it's some historic flexibility that's I believe no longer really
relevant to how we use LMB today, let alone once this patch series is
complete. We should probably (I'm doing my size check thing now..) move
to just following Heinrich's suggestion.
Ilias Apalodimas June 10, 2024, 9:17 p.m. UTC | #3
Hi Sughosh 

[...]

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

This is probably a good opportunity to look into why
CONFIG_LMB_MEMORY_REGIONS was introduced.  Since we are moving towards
static allocations, do we still need it? Or allocating the size dynamically
covers all our cases. 


> +#endif
> +	.memory.cnt = 0,
> +	.reserved.cnt = 0,
> +};
> +
>  static void lmb_dump_region(struct lmb_region *rgn, char *name)
>  {
>  	unsigned long long base, size, end;
> @@ -42,8 +61,8 @@ static void lmb_dump_region(struct lmb_region *rgn, char *name)
>  void lmb_dump_all_force(struct lmb *lmb)
>  {
>  	printf("lmb_dump_all:\n");
> -	lmb_dump_region(&lmb->memory, "memory");
> -	lmb_dump_region(&lmb->reserved, "reserved");
> +	lmb_dump_region(&lmb.memory, "memory");
> +	lmb_dump_region(&lmb.reserved, "reserved");
>  }
>  
 
[...]


Thanks
/Ilias
Simon Glass June 11, 2024, 6:52 p.m. UTC | #4
HI Sughosh,

On Fri, 7 Jun 2024 at 12:53, Sughosh Ganu <sughosh.ganu@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.ganu@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
diff mbox series

Patch

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,
+};
+
 static void lmb_dump_region(struct lmb_region *rgn, char *name)
 {
 	unsigned long long base, size, end;
@@ -42,8 +61,8 @@  static void lmb_dump_region(struct lmb_region *rgn, char *name)
 void lmb_dump_all_force(struct lmb *lmb)
 {
 	printf("lmb_dump_all:\n");
-	lmb_dump_region(&lmb->memory, "memory");
-	lmb_dump_region(&lmb->reserved, "reserved");
+	lmb_dump_region(&lmb.memory, "memory");
+	lmb_dump_region(&lmb.reserved, "reserved");
 }
 
 void lmb_dump_all(struct lmb *lmb)
@@ -130,21 +149,6 @@  static void lmb_fix_over_lap_regions(struct lmb_region *rgn, unsigned long r1,
 	lmb_remove_region(rgn, r2);
 }
 
-void lmb_init(struct lmb *lmb)
-{
-#if IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
-	lmb->memory.max = CONFIG_LMB_MAX_REGIONS;
-	lmb->reserved.max = CONFIG_LMB_MAX_REGIONS;
-#else
-	lmb->memory.max = CONFIG_LMB_MEMORY_REGIONS;
-	lmb->reserved.max = CONFIG_LMB_RESERVED_REGIONS;
-	lmb->memory.region = lmb->memory_regions;
-	lmb->reserved.region = lmb->reserved_regions;
-#endif
-	lmb->memory.cnt = 0;
-	lmb->reserved.cnt = 0;
-}
-
 void arch_lmb_reserve_generic(struct lmb *lmb, ulong sp, ulong end, ulong align)
 {
 	ulong bank_end;
@@ -231,8 +235,6 @@  void lmb_init_and_reserve(struct lmb *lmb, struct bd_info *bd, void *fdt_blob)
 {
 	int i;
 
-	lmb_init(lmb);
-
 	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
 		if (bd->bi_dram[i].size) {
 			lmb_add(lmb, bd->bi_dram[i].start,
@@ -247,7 +249,6 @@  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)
 {
-	lmb_init(lmb);
 	lmb_add(lmb, base, size);
 	lmb_reserve_common(lmb, fdt_blob);
 }
@@ -352,14 +353,14 @@  static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base,
 /* This routine may be called with relocation disabled. */
 long lmb_add(struct lmb *lmb, phys_addr_t base, phys_size_t size)
 {
-	struct lmb_region *_rgn = &(lmb->memory);
+	struct lmb_region *_rgn = &lmb.memory;
 
 	return lmb_add_region(_rgn, base, size);
 }
 
 long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size)
 {
-	struct lmb_region *rgn = &(lmb->reserved);
+	struct lmb_region *rgn = &lmb.reserved;
 	phys_addr_t rgnbegin, rgnend;
 	phys_addr_t end = base + size - 1;
 	int i;
@@ -410,7 +411,7 @@  long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size)
 long lmb_reserve_flags(struct lmb *lmb, phys_addr_t base, phys_size_t size,
 		       enum lmb_flags flags)
 {
-	struct lmb_region *_rgn = &(lmb->reserved);
+	struct lmb_region *_rgn = &lmb.reserved;
 
 	return lmb_add_region_flags(_rgn, base, size, flags);
 }
@@ -447,9 +448,9 @@  static phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size,
 	phys_addr_t base = 0;
 	phys_addr_t res_base;
 
-	for (i = lmb->memory.cnt - 1; i >= 0; i--) {
-		phys_addr_t lmbbase = lmb->memory.region[i].base;
-		phys_size_t lmbsize = lmb->memory.region[i].size;
+	for (i = lmb.memory.cnt - 1; i >= 0; i--) {
+		phys_addr_t lmbbase = lmb.memory.region[i].base;
+		phys_size_t lmbsize = lmb.memory.region[i].size;
 
 		if (lmbsize < size)
 			continue;
@@ -465,15 +466,15 @@  static phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size,
 			continue;
 
 		while (base && lmbbase <= base) {
-			rgn = lmb_overlaps_region(&lmb->reserved, base, size);
+			rgn = lmb_overlaps_region(&lmb.reserved, base, size);
 			if (rgn < 0) {
 				/* This area isn't reserved, take it */
-				if (lmb_add_region(&lmb->reserved, base,
+				if (lmb_add_region(&lmb.reserved, base,
 						   size) < 0)
 					return 0;
 				return base;
 			}
-			res_base = lmb->reserved.region[rgn].base;
+			res_base = lmb.reserved.region[rgn].base;
 			if (res_base < size)
 				break;
 			base = lmb_align_down(res_base - size, align);
@@ -509,14 +510,14 @@  phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base, phys_size_t size)
 	long rgn;
 
 	/* Check if the requested address is in one of the memory regions */
-	rgn = lmb_overlaps_region(&lmb->memory, base, size);
+	rgn = lmb_overlaps_region(&lmb.memory, base, size);
 	if (rgn >= 0) {
 		/*
 		 * Check if the requested end address is in the same memory
 		 * region we found.
 		 */
-		if (lmb_addrs_overlap(lmb->memory.region[rgn].base,
-				      lmb->memory.region[rgn].size,
+		if (lmb_addrs_overlap(lmb.memory.region[rgn].base,
+				      lmb.memory.region[rgn].size,
 				      base + size - 1, 1)) {
 			/* ok, reserve the memory */
 			if (lmb_reserve(lmb, base, size) >= 0)
@@ -533,22 +534,22 @@  phys_size_t lmb_get_free_size(struct lmb *lmb, phys_addr_t addr)
 	long rgn;
 
 	/* check if the requested address is in the memory regions */
-	rgn = lmb_overlaps_region(&lmb->memory, addr, 1);
+	rgn = lmb_overlaps_region(&lmb.memory, addr, 1);
 	if (rgn >= 0) {
-		for (i = 0; i < lmb->reserved.cnt; i++) {
-			if (addr < lmb->reserved.region[i].base) {
+		for (i = 0; i < lmb.reserved.cnt; i++) {
+			if (addr < lmb.reserved.region[i].base) {
 				/* first reserved range > requested address */
-				return lmb->reserved.region[i].base - addr;
+				return lmb.reserved.region[i].base - addr;
 			}
-			if (lmb->reserved.region[i].base +
-			    lmb->reserved.region[i].size > addr) {
+			if (lmb.reserved.region[i].base +
+			    lmb.reserved.region[i].size > addr) {
 				/* requested addr is in this reserved range */
 				return 0;
 			}
 		}
 		/* if we come here: no reserved ranges above requested addr */
-		return lmb->memory.region[lmb->memory.cnt - 1].base +
-		       lmb->memory.region[lmb->memory.cnt - 1].size - addr;
+		return lmb.memory.region[lmb.memory.cnt - 1].base +
+		       lmb.memory.region[lmb.memory.cnt - 1].size - addr;
 	}
 	return 0;
 }
@@ -557,11 +558,11 @@  int lmb_is_reserved_flags(struct lmb *lmb, phys_addr_t addr, int flags)
 {
 	int i;
 
-	for (i = 0; i < lmb->reserved.cnt; i++) {
-		phys_addr_t upper = lmb->reserved.region[i].base +
-			lmb->reserved.region[i].size - 1;
-		if ((addr >= lmb->reserved.region[i].base) && (addr <= upper))
-			return (lmb->reserved.region[i].flags & flags) == flags;
+	for (i = 0; i < lmb.reserved.cnt; i++) {
+		phys_addr_t upper = lmb.reserved.region[i].base +
+			lmb.reserved.region[i].size - 1;
+		if ((addr >= lmb.reserved.region[i].base) && (addr <= upper))
+			return (lmb.reserved.region[i].flags & flags) == flags;
 	}
 	return 0;
 }
diff --git a/test/lib/lmb.c b/test/lib/lmb.c
index 7e4368de22..42551b7c6d 100644
--- a/test/lib/lmb.c
+++ b/test/lib/lmb.c
@@ -76,8 +76,6 @@  static int test_multi_alloc(struct unit_test_state *uts, const phys_addr_t ram,
 	ut_assert(alloc_64k_addr >= ram + 8);
 	ut_assert(alloc_64k_end <= ram_end - 8);
 
-	lmb_init(&lmb);
-
 	if (ram0_size) {
 		ret = lmb_add(&lmb, ram0, ram0_size);
 		ut_asserteq(ret, 0);
@@ -237,8 +235,6 @@  static int test_bigblock(struct unit_test_state *uts, const phys_addr_t ram)
 	/* check for overflow */
 	ut_assert(ram_end == 0 || ram_end > ram);
 
-	lmb_init(&lmb);
-
 	ret = lmb_add(&lmb, ram, ram_size);
 	ut_asserteq(ret, 0);
 
@@ -304,8 +300,6 @@  static int test_noreserved(struct unit_test_state *uts, const phys_addr_t ram,
 	/* check for overflow */
 	ut_assert(ram_end == 0 || ram_end > ram);
 
-	lmb_init(&lmb);
-
 	ret = lmb_add(&lmb, ram, ram_size);
 	ut_asserteq(ret, 0);
 	ASSERT_LMB(&lmb, ram, ram_size, 0, 0, 0, 0, 0, 0, 0);
@@ -390,8 +384,6 @@  static int lib_test_lmb_at_0(struct unit_test_state *uts)
 	long ret;
 	phys_addr_t a, b;
 
-	lmb_init(&lmb);
-
 	ret = lmb_add(&lmb, ram, ram_size);
 	ut_asserteq(ret, 0);
 
@@ -429,8 +421,6 @@  static int lib_test_lmb_overlapping_reserve(struct unit_test_state *uts)
 	struct lmb lmb;
 	long ret;
 
-	lmb_init(&lmb);
-
 	ret = lmb_add(&lmb, ram, ram_size);
 	ut_asserteq(ret, 0);
 
@@ -487,8 +477,6 @@  static int test_alloc_addr(struct unit_test_state *uts, const phys_addr_t ram)
 	/* check for overflow */
 	ut_assert(ram_end == 0 || ram_end > ram);
 
-	lmb_init(&lmb);
-
 	ret = lmb_add(&lmb, ram, ram_size);
 	ut_asserteq(ret, 0);
 
@@ -614,8 +602,6 @@  static int test_get_unreserved_size(struct unit_test_state *uts,
 	/* check for overflow */
 	ut_assert(ram_end == 0 || ram_end > ram);
 
-	lmb_init(&lmb);
-
 	ret = lmb_add(&lmb, ram, ram_size);
 	ut_asserteq(ret, 0);
 
@@ -684,8 +670,6 @@  static int lib_test_lmb_max_regions(struct unit_test_state *uts)
 	struct lmb lmb;
 	int ret, i;
 
-	lmb_init(&lmb);
-
 	ut_asserteq(lmb.memory.cnt, 0);
 	ut_asserteq(lmb.memory.max, CONFIG_LMB_MAX_REGIONS);
 	ut_asserteq(lmb.reserved.cnt, 0);
@@ -745,8 +729,6 @@  static int lib_test_lmb_flags(struct unit_test_state *uts)
 	struct lmb lmb;
 	long ret;
 
-	lmb_init(&lmb);
-
 	ret = lmb_add(&lmb, ram, ram_size);
 	ut_asserteq(ret, 0);