diff mbox

[U-Boot,v2,1/9] make SPL and normal u-boot stage use independent SYS_MALLOC_F_LEN

Message ID 1499915549-22563-1-git-send-email-andy.yan@rock-chips.com
State Superseded, archived
Delegated to: Philipp Tomsich
Headers show

Commit Message

Andy Yan July 13, 2017, 3:12 a.m. UTC
Some platforms has very small sram to run spl code, so it has no
enough sapce for so much malloc pool before relocation in
spl stage as the normal u-boot stake.
Make spl and normal u-boot stage use independent SYS_MALLOC_F_LEN,
Then people can sets the pre-relocation malloc pool according to
the memory space indepently.

Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

---

Changes in v2:
- introduce a new control CONFIG_SPL_SYS_MALLOC_F_LEN, adviced by Simon

 Kconfig                           | 10 ++++++++++
 arch/sandbox/cpu/start.c          |  2 +-
 cmd/bdinfo.c                      |  2 +-
 common/Makefile                   |  2 +-
 common/board_f.c                  |  4 ++--
 common/board_r.c                  |  2 +-
 common/dlmalloc.c                 | 12 ++++++------
 common/init/board_init.c          |  4 ++--
 common/spl/spl.c                  |  6 +++---
 drivers/core/Kconfig              |  8 ++++----
 drivers/serial/serial-uclass.c    |  4 ++--
 include/asm-generic/global_data.h |  2 +-
 include/common.h                  | 11 +++++++++++
 lib/asm-offsets.c                 |  2 +-
 lib/efi/efi_app.c                 |  2 +-
 15 files changed, 47 insertions(+), 26 deletions(-)

Comments

Tom Rini July 18, 2017, 12:23 p.m. UTC | #1
On Thu, Jul 13, 2017 at 11:12:29AM +0800, Andy Yan wrote:

> Some platforms has very small sram to run spl code, so it has no
> enough sapce for so much malloc pool before relocation in
> spl stage as the normal u-boot stake.
> Make spl and normal u-boot stage use independent SYS_MALLOC_F_LEN,
> Then people can sets the pre-relocation malloc pool according to
> the memory space indepently.
> 
> Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
> 

Reviewed-by: Tom Rini <trini@konsulko.com>
Simon Glass July 18, 2017, 1:59 p.m. UTC | #2
Hi Andy,

On 12 July 2017 at 20:12, Andy Yan <andy.yan@rock-chips.com> wrote:
>
> Some platforms has very small sram to run spl code, so it has no
> enough sapce for so much malloc pool before relocation in
> spl stage as the normal u-boot stake.
> Make spl and normal u-boot stage use independent SYS_MALLOC_F_LEN,
> Then people can sets the pre-relocation malloc pool according to
> the memory space indepently.
>
> Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
>
> ---
>
> Changes in v2:
> - introduce a new control CONFIG_SPL_SYS_MALLOC_F_LEN, adviced by Simon
>
>  Kconfig                           | 10 ++++++++++
>  arch/sandbox/cpu/start.c          |  2 +-
>  cmd/bdinfo.c                      |  2 +-
>  common/Makefile                   |  2 +-
>  common/board_f.c                  |  4 ++--
>  common/board_r.c                  |  2 +-
>  common/dlmalloc.c                 | 12 ++++++------
>  common/init/board_init.c          |  4 ++--
>  common/spl/spl.c                  |  6 +++---
>  drivers/core/Kconfig              |  8 ++++----
>  drivers/serial/serial-uclass.c    |  4 ++--
>  include/asm-generic/global_data.h |  2 +-
>  include/common.h                  | 11 +++++++++++
>  lib/asm-offsets.c                 |  2 +-
>  lib/efi/efi_app.c                 |  2 +-
>  15 files changed, 47 insertions(+), 26 deletions(-)
>
> diff --git a/Kconfig b/Kconfig
> index bb80ada..c1451bc 100644
> --- a/Kconfig
> +++ b/Kconfig
> @@ -95,6 +95,16 @@ config SYS_MALLOC_F_LEN
>           particular needs this to operate, so that it can allocate the
>           initial serial device and any others that are needed.
>
> +config SPL_SYS_MALLOC_F_LEN
> +        hex "Size of malloc() pool in spl before relocation"
> +        depends on SYS_MALLOC_F
> +        default SYS_MALLOC_F_LEN
> +        help
> +          Before relocation, memory is very limited on many platforms. Still,
> +          we can provide a small malloc() pool if needed. Driver model in
> +          particular needs this to operate, so that it can allocate the
> +          initial serial device and any others that are needed.
> +
>  menuconfig EXPERT
>         bool "Configure standard U-Boot features (expert users)"
>         default y
> diff --git a/arch/sandbox/cpu/start.c b/arch/sandbox/cpu/start.c
> index f605d4d..17e531a 100644
> --- a/arch/sandbox/cpu/start.c
> +++ b/arch/sandbox/cpu/start.c
> @@ -310,7 +310,7 @@ int main(int argc, char *argv[])
>
>         memset(&data, '\0', sizeof(data));
>         gd = &data;
> -#ifdef CONFIG_SYS_MALLOC_F_LEN
> +#ifdef CONFIG_SYS_MALLOC_F

This is a good change. Can you please split out the change to move to
SYS_MALLOC_F into its own patch? It seems to be separate from the
change to support an SPL version.

>         gd->malloc_base = CONFIG_MALLOC_F_ADDR;
>  #endif
>         setup_ram_buf(state);
> diff --git a/cmd/bdinfo.c b/cmd/bdinfo.c
> index 8971697..64836e9 100644
> --- a/cmd/bdinfo.c
> +++ b/cmd/bdinfo.c
> @@ -346,7 +346,7 @@ static int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc,
>  #endif
>  #ifdef CONFIG_SYS_MALLOC_F
>         printf("Early malloc usage: %lx / %x\n", gd->malloc_ptr,
> -              CONFIG_SYS_MALLOC_F_LEN);
> +              get_sys_malloc_f_len());


Can you use CONFIG_VAL(SYS_MALLOC_F_LEN) here instead of the function?

[...]

Regards,
Simon
diff mbox

Patch

diff --git a/Kconfig b/Kconfig
index bb80ada..c1451bc 100644
--- a/Kconfig
+++ b/Kconfig
@@ -95,6 +95,16 @@  config SYS_MALLOC_F_LEN
 	  particular needs this to operate, so that it can allocate the
 	  initial serial device and any others that are needed.
 
+config SPL_SYS_MALLOC_F_LEN
+        hex "Size of malloc() pool in spl before relocation"
+        depends on SYS_MALLOC_F
+        default SYS_MALLOC_F_LEN
+        help
+          Before relocation, memory is very limited on many platforms. Still,
+          we can provide a small malloc() pool if needed. Driver model in
+          particular needs this to operate, so that it can allocate the
+          initial serial device and any others that are needed.
+
 menuconfig EXPERT
 	bool "Configure standard U-Boot features (expert users)"
 	default y
diff --git a/arch/sandbox/cpu/start.c b/arch/sandbox/cpu/start.c
index f605d4d..17e531a 100644
--- a/arch/sandbox/cpu/start.c
+++ b/arch/sandbox/cpu/start.c
@@ -310,7 +310,7 @@  int main(int argc, char *argv[])
 
 	memset(&data, '\0', sizeof(data));
 	gd = &data;
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#ifdef CONFIG_SYS_MALLOC_F
 	gd->malloc_base = CONFIG_MALLOC_F_ADDR;
 #endif
 	setup_ram_buf(state);
diff --git a/cmd/bdinfo.c b/cmd/bdinfo.c
index 8971697..64836e9 100644
--- a/cmd/bdinfo.c
+++ b/cmd/bdinfo.c
@@ -346,7 +346,7 @@  static int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc,
 #endif
 #ifdef CONFIG_SYS_MALLOC_F
 	printf("Early malloc usage: %lx / %x\n", gd->malloc_ptr,
-	       CONFIG_SYS_MALLOC_F_LEN);
+	       get_sys_malloc_f_len());
 #endif
 	if (gd->fdt_blob)
 		printf("fdt_blob = %p\n", gd->fdt_blob);
diff --git a/common/Makefile b/common/Makefile
index 17a92ea..29c880d 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -139,7 +139,7 @@  obj-y += console.o
 endif
 obj-$(CONFIG_CROS_EC) += cros_ec.o
 obj-y += dlmalloc.o
-ifdef CONFIG_SYS_MALLOC_F_LEN
+ifdef CONFIG_SYS_MALLOC_F
 obj-y += malloc_simple.o
 endif
 obj-y += image.o
diff --git a/common/board_f.c b/common/board_f.c
index ffa84e3..82dae70 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -727,7 +727,7 @@  static int initf_bootstage(void)
 
 static int initf_console_record(void)
 {
-#if defined(CONFIG_CONSOLE_RECORD) && defined(CONFIG_SYS_MALLOC_F_LEN)
+#if defined(CONFIG_CONSOLE_RECORD) && defined(CONFIG_SYS_MALLOC_F)
 	return console_record_init();
 #else
 	return 0;
@@ -736,7 +736,7 @@  static int initf_console_record(void)
 
 static int initf_dm(void)
 {
-#if defined(CONFIG_DM) && defined(CONFIG_SYS_MALLOC_F_LEN)
+#if defined(CONFIG_DM) && defined(CONFIG_SYS_MALLOC_F)
 	int ret;
 
 	bootstage_start(BOOTSTATE_ID_ACCUM_DM_F, "dm_f");
diff --git a/common/board_r.c b/common/board_r.c
index ecca1ed..e7d4010 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -256,7 +256,7 @@  static int initr_malloc(void)
 {
 	ulong malloc_start;
 
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#ifdef CONFIG_SYS_MALLOC_F
 	debug("Pre-reloc malloc() used %#lx bytes (%ld KB)\n", gd->malloc_ptr,
 	      gd->malloc_ptr / 1024);
 #endif
diff --git a/common/dlmalloc.c b/common/dlmalloc.c
index fc1e8b3..d19c3e1 100644
--- a/common/dlmalloc.c
+++ b/common/dlmalloc.c
@@ -1254,7 +1254,7 @@  Void_t* mALLOc(bytes) size_t bytes;
 
   INTERNAL_SIZE_T nb;
 
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#ifdef CONFIG_SYS_MALLOC_F
 	if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT))
 		return malloc_simple(bytes);
 #endif
@@ -1522,7 +1522,7 @@  void fREe(mem) Void_t* mem;
   mchunkptr fwd;       /* misc temp for linking */
   int       islr;      /* track whether merging with last_remainder */
 
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#ifdef CONFIG_SYS_MALLOC_F
 	/* free() is a no-op - all the memory will be freed on relocation */
 	if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT))
 		return;
@@ -1679,7 +1679,7 @@  Void_t* rEALLOc(oldmem, bytes) Void_t* oldmem; size_t bytes;
   /* realloc of null is supposed to be same as malloc */
   if (oldmem == NULL) return mALLOc(bytes);
 
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#ifdef CONFIG_SYS_MALLOC_F
 	if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) {
 		/* This is harder to support and should not be needed */
 		panic("pre-reloc realloc() is not supported");
@@ -2074,7 +2074,7 @@  Void_t* cALLOc(n, elem_size) size_t n; size_t elem_size;
     return NULL;
   else
   {
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#ifdef CONFIG_SYS_MALLOC_F
 	if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) {
 		MALLOC_ZERO(mem, sz);
 		return mem;
@@ -2375,9 +2375,9 @@  int mALLOPt(param_number, value) int param_number; int value;
 
 int initf_malloc(void)
 {
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#ifdef CONFIG_SYS_MALLOC_F
 	assert(gd->malloc_base);	/* Set up by crt0.S */
-	gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN;
+	gd->malloc_limit = get_sys_malloc_f_len();
 	gd->malloc_ptr = 0;
 #endif
 
diff --git a/common/init/board_init.c b/common/init/board_init.c
index bf4255b..7698558 100644
--- a/common/init/board_init.c
+++ b/common/init/board_init.c
@@ -47,7 +47,7 @@  ulong board_init_f_alloc_reserve(ulong top)
 {
 	/* Reserve early malloc arena */
 #if defined(CONFIG_SYS_MALLOC_F)
-	top -= CONFIG_SYS_MALLOC_F_LEN;
+	top -= get_sys_malloc_f_len();
 #endif
 	/* LAST : reserve GD (rounded up to a multiple of 16 bytes) */
 	top = rounddown(top-sizeof(struct global_data), 16);
@@ -125,7 +125,7 @@  void board_init_f_init_reserve(ulong base)
 	/* go down one 'early malloc arena' */
 	gd->malloc_base = base;
 	/* next alloc will be higher by one 'early malloc arena' size */
-	base += CONFIG_SYS_MALLOC_F_LEN;
+	base += get_sys_malloc_f_len();
 #endif
 }
 
diff --git a/common/spl/spl.c b/common/spl/spl.c
index 7f3fd92..006ed02 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -220,12 +220,12 @@  static int spl_common_init(bool setup_malloc)
 
 	debug("spl_early_init()\n");
 
-#if defined(CONFIG_SYS_MALLOC_F_LEN)
+#if defined(CONFIG_SYS_MALLOC_F)
 	if (setup_malloc) {
 #ifdef CONFIG_MALLOC_F_ADDR
 		gd->malloc_base = CONFIG_MALLOC_F_ADDR;
 #endif
-		gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN;
+		gd->malloc_limit = get_sys_malloc_f_len();
 		gd->malloc_ptr = 0;
 	}
 #endif
@@ -419,7 +419,7 @@  void board_init_r(gd_t *dummy1, ulong dummy2)
 	default:
 		debug("Unsupported OS image.. Jumping nevertheless..\n");
 	}
-#if defined(CONFIG_SYS_MALLOC_F_LEN) && !defined(CONFIG_SYS_SPL_MALLOC_SIZE)
+#if defined(CONFIG_SYS_MALLOC_F) && !defined(CONFIG_SYS_SPL_MALLOC_SIZE)
 	debug("SPL malloc() used %#lx bytes (%ld KB)\n", gd->malloc_ptr,
 	      gd->malloc_ptr / 1024);
 #endif
diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig
index fb5c4e8..f8b19a4 100644
--- a/drivers/core/Kconfig
+++ b/drivers/core/Kconfig
@@ -16,10 +16,10 @@  config SPL_DM
 	  suitable malloc() implementation. If you are not using the
 	  full malloc() enabled by CONFIG_SYS_SPL_MALLOC_START,
 	  consider using CONFIG_SYS_MALLOC_SIMPLE. In that case you
-	  must provide CONFIG_SYS_MALLOC_F_LEN to set the size.
+	  must provide CONFIG_SPL_SYS_MALLOC_F_LEN to set the size.
 	  In most cases driver model will only allocate a few uclasses
 	  and devices in SPL, so 1KB should be enable. See
-	  CONFIG_SYS_MALLOC_F_LEN for more details on how to enable it.
+	  CONFIG_SPL_SYS_MALLOC_F_LEN for more details on how to enable it.
 
 config TPL_DM
 	bool "Enable Driver Model for TPL"
@@ -29,10 +29,10 @@  config TPL_DM
 	  suitable malloc() implementation. If you are not using the
 	  full malloc() enabled by CONFIG_SYS_SPL_MALLOC_START,
 	  consider using CONFIG_SYS_MALLOC_SIMPLE. In that case you
-	  must provide CONFIG_SYS_MALLOC_F_LEN to set the size.
+	  must provide CONFIG_SPL_SYS_MALLOC_F_LEN to set the size.
 	  In most cases driver model will only allocate a few uclasses
 	  and devices in SPL, so 1KB should be enough. See
-	  CONFIG_SYS_MALLOC_F_LEN for more details on how to enable it.
+	  CONFIG_SPL_SYS_MALLOC_F_LEN for more details on how to enable it.
 	  Disable this for very small implementations.
 
 config DM_WARN
diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
index f360534..8d63b05 100644
--- a/drivers/serial/serial-uclass.c
+++ b/drivers/serial/serial-uclass.c
@@ -23,8 +23,8 @@  DECLARE_GLOBAL_DATA_PTR;
  */
 static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE;
 
-#ifndef CONFIG_SYS_MALLOC_F_LEN
-#error "Serial is required before relocation - define CONFIG_SYS_MALLOC_F_LEN to make this work"
+#ifndef CONFIG_SYS_MALLOC_F
+#error "Serial is required before relocation - define CONFIG_$(SPL_)SYS_MALLOC_F_LEN to make this work"
 #endif
 
 static int serial_check_stdout(const void *blob, struct udevice **devp)
diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
index fb90be9..cf3e12a 100644
--- a/include/asm-generic/global_data.h
+++ b/include/asm-generic/global_data.h
@@ -88,7 +88,7 @@  typedef struct global_data {
 #endif
 	unsigned int timebase_h;
 	unsigned int timebase_l;
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#ifdef CONFIG_SYS_MALLOC_F
 	unsigned long malloc_base;	/* base address of early malloc() */
 	unsigned long malloc_limit;	/* limit address */
 	unsigned long malloc_ptr;	/* current address */
diff --git a/include/common.h b/include/common.h
index 751665f..afba422 100644
--- a/include/common.h
+++ b/include/common.h
@@ -717,6 +717,17 @@  int cpu_disable(int nr);
 int cpu_release(int nr, int argc, char * const argv[]);
 #endif
 
+#if defined(CONFIG_SYS_MALLOC_F)
+static inline int get_sys_malloc_f_len(void)
+{
+#if defined(CONFIG_SPL_BUILD)
+	return CONFIG_SPL_SYS_MALLOC_F_LEN;
+#else
+	return CONFIG_SYS_MALLOC_F_LEN;
+#endif
+}
+#endif
+
 #else	/* __ASSEMBLY__ */
 
 /* Drop a C type modifier (like in 3UL) for constants used in assembly. */
diff --git a/lib/asm-offsets.c b/lib/asm-offsets.c
index 221ebbf..a65df59 100644
--- a/lib/asm-offsets.c
+++ b/lib/asm-offsets.c
@@ -28,7 +28,7 @@  int main(void)
 	DEFINE(GD_SIZE, sizeof(struct global_data));
 
 	DEFINE(GD_BD, offsetof(struct global_data, bd));
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#ifdef CONFIG_SYS_MALLOC_F
 	DEFINE(GD_MALLOC_BASE, offsetof(struct global_data, malloc_base));
 #endif
 
diff --git a/lib/efi/efi_app.c b/lib/efi/efi_app.c
index 452ab5d..89bbc1b 100644
--- a/lib/efi/efi_app.c
+++ b/lib/efi/efi_app.c
@@ -48,7 +48,7 @@  static efi_status_t setup_memory(struct efi_priv *priv)
 		return ret;
 	memset(gd, '\0', sizeof(*gd));
 
-	gd->malloc_base = (ulong)efi_malloc(priv, CONFIG_SYS_MALLOC_F_LEN,
+	gd->malloc_base = (ulong)efi_malloc(priv, get_sys_malloc_f_len(),
 					    &ret);
 	if (!gd->malloc_base)
 		return ret;