From 77b8cfef531f7758f35a8598bd474713cfc2c2ec Mon Sep 17 00:00:00 2001 From: Patrick Delaunay Date: Wed, 10 Mar 2021 10:16:25 +0100 Subject: lmb: move CONFIG_LMB in Kconfig Migrate CONFIG_LMB in Kconfig. Signed-off-by: Patrick Delaunay --- lib/Kconfig | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'lib') diff --git a/lib/Kconfig b/lib/Kconfig index ab8c9ccd600..b7df9eb5d61 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -700,6 +700,13 @@ config LIB_ELF Support basic elf loading/validating functions. This supports for 32 bit and 64 bit versions. +config LMB + bool "Enable the logical memory blocks library (lmb)" + default y if ARC || ARM || M68K || MICROBLAZE || MIPS || NDS32 || \ + NIOS2 || PPC || RISCV || SANDBOX || SH || X86 || XTENSA + help + Support the library logical memory blocks. + endmenu config PHANDLE_CHECK_SEQ -- cgit v1.2.3 From 8f167da9c572845782000075e092e63a8273032d Mon Sep 17 00:00:00 2001 From: Patrick Delaunay Date: Wed, 10 Mar 2021 10:16:26 +0100 Subject: lmb: remove lmb_region.size Remove the unused field size of struct lmb_region as it is initialized to 0 and never used after in lmb library. See Linux kernel commit 4734b594c6ca ("memblock: Remove memblock_type.size and add memblock.memory_size instead") Signed-off-by: Patrick Delaunay --- lib/lmb.c | 6 ------ 1 file changed, 6 deletions(-) (limited to 'lib') diff --git a/lib/lmb.c b/lib/lmb.c index d126f8dc04a..5cf419f439a 100644 --- a/lib/lmb.c +++ b/lib/lmb.c @@ -20,8 +20,6 @@ void lmb_dump_all_force(struct lmb *lmb) printf("lmb_dump_all:\n"); printf(" memory.cnt = 0x%lx\n", lmb->memory.cnt); - printf(" memory.size = 0x%llx\n", - (unsigned long long)lmb->memory.size); for (i = 0; i < lmb->memory.cnt; i++) { printf(" memory.reg[0x%lx].base = 0x%llx\n", i, (unsigned long long)lmb->memory.region[i].base); @@ -30,8 +28,6 @@ void lmb_dump_all_force(struct lmb *lmb) } printf("\n reserved.cnt = 0x%lx\n", lmb->reserved.cnt); - printf(" reserved.size = 0x%llx\n", - (unsigned long long)lmb->reserved.size); for (i = 0; i < lmb->reserved.cnt; i++) { printf(" reserved.reg[0x%lx].base = 0x%llx\n", i, (unsigned long long)lmb->reserved.region[i].base); @@ -100,9 +96,7 @@ static void lmb_coalesce_regions(struct lmb_region *rgn, unsigned long r1, void lmb_init(struct lmb *lmb) { lmb->memory.cnt = 0; - lmb->memory.size = 0; lmb->reserved.cnt = 0; - lmb->reserved.size = 0; } static void lmb_reserve_common(struct lmb *lmb, void *fdt_blob) -- cgit v1.2.3 From 00fd8dad4d2ed738d11f29d992dc106bbdf4d68f Mon Sep 17 00:00:00 2001 From: Patrick Delaunay Date: Wed, 10 Mar 2021 10:16:27 +0100 Subject: lmb: add a max parameter in the struct lmb_region Add a max parameter in lmb_region struct to handle test in lmb_add_region without using the MAX_LMB_REGIONS define. This patch allows to modify these size independently for memory of reserved regions in the next patches. Signed-off-by: Patrick Delaunay --- lib/lmb.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/lmb.c b/lib/lmb.c index 5cf419f439a..a926198d487 100644 --- a/lib/lmb.c +++ b/lib/lmb.c @@ -95,6 +95,9 @@ static void lmb_coalesce_regions(struct lmb_region *rgn, unsigned long r1, void lmb_init(struct lmb *lmb) { + lmb->memory.max = MAX_LMB_REGIONS; + lmb->reserved.max = MAX_LMB_REGIONS; + lmb->memory.cnt = 0; lmb->reserved.cnt = 0; } @@ -179,7 +182,7 @@ static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t if (coalesced) return coalesced; - if (rgn->cnt >= MAX_LMB_REGIONS) + if (rgn->cnt >= rgn->max) return -1; /* Couldn't coalesce the LMB, so add it to the sorted table. */ -- cgit v1.2.3 From 4fa0150d6c9c252af6887c55cbacd6734a40e9ab Mon Sep 17 00:00:00 2001 From: Patrick Delaunay Date: Wed, 10 Mar 2021 10:16:28 +0100 Subject: lmb: move MAX_LMB_REGIONS value in Kconfig Move MAX_LMB_REGIONS value in Kconfig, the max number of the regions in lmb library. Signed-off-by: Patrick Delaunay --- lib/Kconfig | 10 +++++++++- lib/lmb.c | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/Kconfig b/lib/Kconfig index b7df9eb5d61..e46c51f123f 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -439,7 +439,7 @@ config LZ4 is included. The LZ4 algorithm can run in-place as long as the compressed image is loaded to the end of the output buffer, and trades lower compression ratios for much faster decompression. - + NOTE: This implements the release version of the LZ4 frame format as generated by default by the 'lz4' command line tool. This is not the same as the outdated, less efficient legacy @@ -707,6 +707,14 @@ config LMB help Support the library logical memory blocks. + +config LMB_MAX_REGIONS + int "Number of memory and reserved regions in lmb lib" + depends on LMB + default 8 + help + Define the number of supported regions, memory and reserved, in the + library logical memory blocks. endmenu config PHANDLE_CHECK_SEQ diff --git a/lib/lmb.c b/lib/lmb.c index a926198d487..9fbc56619b4 100644 --- a/lib/lmb.c +++ b/lib/lmb.c @@ -95,8 +95,8 @@ static void lmb_coalesce_regions(struct lmb_region *rgn, unsigned long r1, void lmb_init(struct lmb *lmb) { - lmb->memory.max = MAX_LMB_REGIONS; - lmb->reserved.max = MAX_LMB_REGIONS; + lmb->memory.max = CONFIG_LMB_MAX_REGIONS; + lmb->reserved.max = CONFIG_LMB_MAX_REGIONS; lmb->memory.cnt = 0; lmb->reserved.cnt = 0; -- cgit v1.2.3 From 6d66502bc74182105c7fc77efe7bf8d04ac4e345 Mon Sep 17 00:00:00 2001 From: Patrick Delaunay Date: Wed, 10 Mar 2021 10:16:31 +0100 Subject: 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 --- lib/Kconfig | 29 ++++++++++++++++++++++++++++- lib/lmb.c | 8 +++++++- 2 files changed, 35 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/Kconfig b/lib/Kconfig index e46c51f123f..6d2d41de301 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -707,14 +707,41 @@ config LMB help 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 int "Number of memory and reserved regions in lmb lib" - depends on LMB + depends on LMB && LMB_USE_MAX_REGIONS default 8 help Define the number of supported regions, memory and reserved, in the 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 config PHANDLE_CHECK_SEQ diff --git a/lib/lmb.c b/lib/lmb.c index 9fbc56619b4..c08c4d942b7 100644 --- a/lib/lmb.c +++ b/lib/lmb.c @@ -95,9 +95,15 @@ static void lmb_coalesce_regions(struct lmb_region *rgn, unsigned long r1, 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; } -- cgit v1.2.3