[U-Boot] [PATCH v2 04/13] dm: spl: Make simple malloc() available when enabled

Simon Glass
2014-10-28T00:07:38Z

Hi Tom,

On 24 October 2014 12:59, Tom Rini <trini@ti.com> wrote:
>
> On Thu, Oct 23, 2014 at 01:16:01PM -0600, Simon Glass wrote:
>
> > Set up the simple malloc() implementation when requested, in preference to
> > the full malloc().
> >
> > Signed-off-by: Simon Glass <sjg@chromium.org>
> > ---
> >
> > Changes in v2: None
> >
> > common/spl/spl.c | 11 ++++++++++-
> > 1 file changed, 10 insertions(+), 1 deletion(-)
> >
> > diff --git a/common/spl/spl.c b/common/spl/spl.c
> > index b16664f..7168854 100644
> > --- a/common/spl/spl.c
> > +++ b/common/spl/spl.c
> > @@ -134,9 +134,13 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
> > u32 boot_device;
> > debug(">>spl:board_init_r()\n");
> >
> > -#ifdef CONFIG_SYS_SPL_MALLOC_START
> > +#if defined(CONFIG_SYS_SPL_MALLOC_START)
> > mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START,
> > CONFIG_SYS_SPL_MALLOC_SIZE);
> > + gd->flags |= GD_FLG_FULL_MALLOC_INIT;
> > +#elif defined(CONFIG_SYS_MALLOC_F_LEN)
> > + gd->malloc_limit = gd->malloc_base + CONFIG_SYS_MALLOC_F_LEN;
> > + gd->malloc_ptr = 0;
> > #endif
> >
> > #ifndef CONFIG_PPC
> > @@ -233,6 +237,11 @@ 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)
> > + debug("SPL malloc() used %#lx bytes (%ld KB)\n", gd->malloc_ptr,
> > + gd->malloc_ptr / 1024);
> > +#endif
> > +
> > jump_to_image_no_args(&spl_image);
> > }
>
> I don't know if this is right. Take the example of am335x + booting
> from a FAT fs image. We'll need early malloc prior to DDR being
> available, so the tiny space (1-2kb). But once DDR is up we need a more
> complete malloc so that we can use FAT. I don't have the size handy but
> I'm going to guess that (a) it's bigger than 1-2kb (b) bigger than we
> can squeeze into SRAM.

Here's the malloc() approach I think we need for each stage:

- SPL: full malloc() if enabled as with FAT support in SPL, else simple malloc()
- U-Boot pre-reloc: simple malloc()
- U-Boot post-reloc: full malloc()

So I think that even in the case you raise we need the simple
malloc(), not for SPL but for U-Boot pre-reloc. I have fiddled with
the logic here a few times while figuring this out, and I suspect we
will refine it. But the intent is to use full malloc() where available
and simple malloc() where not.

Regards,
Simon