lmb: Add 2 config to define the max number of regions

Add 2 configs CONFIG_LMB_MEMORY_REGIONS and CONFIG_LMB_RESERVED_REGIONS
to change independently the max number of the regions in lmb
library.

When CONFIG_LMB_USE_MAX_REGIONS=y, move the lmb property arrays to
struct lmb and manage the array size with the element 'max' of struct
lmb_region; their are still allocated in stack.

When CONFIG_LMB_USE_MAX_REGIONS=n, keep the current location in
struct lmb_region to allow compiler optimization.

Increase CONFIG_LMB_RESERVED_REGIONS is useful to avoid lmb errors in
bootm when the number of reserved regions (not adjacent) is reached:
+ 1 region for relocated U-Boot
+ 1 region for initrd
+ 1 region for relocated linux device tree
+ reserved memory regions present in Linux device tree.

The current limit of 8 regions is reached with only 5 reserved regions
in DT.

see Linux kernel commit bf23c51f1f49 ("memblock: Move memblock arrays
to static storage in memblock.c and make their size a variable")

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
This commit is contained in:
Patrick Delaunay 2021-03-10 10:16:31 +01:00 committed by Tom Rini
parent a57b596e8b
commit 6d66502bc7
3 changed files with 69 additions and 2 deletions

View File

@ -12,20 +12,54 @@
* Copyright (C) 2001 Peter Bergner, IBM Corp. * Copyright (C) 2001 Peter Bergner, IBM Corp.
*/ */
/**
* struct lmb_property - Description of one region.
*
* @base: Base address of the region.
* @size: Size of the region
*/
struct lmb_property { struct lmb_property {
phys_addr_t base; phys_addr_t base;
phys_size_t size; phys_size_t size;
}; };
/**
* struct lmb_region - Description of a set of region.
*
* @cnt: Number of regions.
* @max: Size of the region array, max value of cnt.
* @region: Array of the region properties
*/
struct lmb_region { struct lmb_region {
unsigned long cnt; unsigned long cnt;
unsigned long max; unsigned long max;
#if IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
struct lmb_property region[CONFIG_LMB_MAX_REGIONS]; struct lmb_property region[CONFIG_LMB_MAX_REGIONS];
#else
struct lmb_property *region;
#endif
}; };
/**
* 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.
*
* @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 {
struct lmb_region memory; struct lmb_region memory;
struct lmb_region reserved; 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
}; };
extern void lmb_init(struct lmb *lmb); extern void lmb_init(struct lmb *lmb);

View File

@ -707,14 +707,41 @@ config LMB
help help
Support the library logical memory blocks. Support the library logical memory blocks.
config LMB_USE_MAX_REGIONS
bool "Use a commun number of memory and reserved regions in lmb lib"
depends on LMB
default y
help
Define the number of supported memory regions in the library logical
memory blocks.
This feature allow to reduce the lmb library size by using compiler
optimization when LMB_MEMORY_REGIONS == LMB_RESERVED_REGIONS.
config LMB_MAX_REGIONS config LMB_MAX_REGIONS
int "Number of memory and reserved regions in lmb lib" int "Number of memory and reserved regions in lmb lib"
depends on LMB depends on LMB && LMB_USE_MAX_REGIONS
default 8 default 8
help help
Define the number of supported regions, memory and reserved, in the Define the number of supported regions, memory and reserved, in the
library logical memory blocks. library logical memory blocks.
config LMB_MEMORY_REGIONS
int "Number of memory regions in lmb lib"
depends on LMB && !LMB_USE_MAX_REGIONS
default 8
help
Define the number of supported memory regions in the library logical
memory blocks.
The minimal value is CONFIG_NR_DRAM_BANKS.
config LMB_RESERVED_REGIONS
int "Number of reserved regions in lmb lib"
depends on LMB && !LMB_USE_MAX_REGIONS
default 8
help
Define the number of supported reserved regions in the library logical
memory blocks.
endmenu endmenu
config PHANDLE_CHECK_SEQ config PHANDLE_CHECK_SEQ

View File

@ -95,9 +95,15 @@ static void lmb_coalesce_regions(struct lmb_region *rgn, unsigned long r1,
void lmb_init(struct lmb *lmb) void lmb_init(struct lmb *lmb)
{ {
#if IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
lmb->memory.max = CONFIG_LMB_MAX_REGIONS; lmb->memory.max = CONFIG_LMB_MAX_REGIONS;
lmb->reserved.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->memory.cnt = 0;
lmb->reserved.cnt = 0; lmb->reserved.cnt = 0;
} }