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
 
 #ifdef CONFIG_BOARD_TYPES
        printf("Board Type  = %ld\n", gd->board_type);
 #endif
-#ifdef CONFIG_SYS_MALLOC_F
+#if CONFIG_VAL(SYS_MALLOC_F_LEN)
        printf("Early malloc usage: %lx / %x\n", gd->malloc_ptr,
-              CONFIG_SYS_MALLOC_F_LEN);
+              CONFIG_VAL(SYS_MALLOC_F_LEN));
 #endif
        if (gd->fdt_blob)
                printf("fdt_blob = %p\n", gd->fdt_blob);
 
 endif
 obj-$(CONFIG_CROS_EC) += cros_ec.o
 obj-y += dlmalloc.o
-ifdef CONFIG_SYS_MALLOC_F_LEN
+ifdef CONFIG_SYS_MALLOC_F
+ifneq ($(CONFIG_$(SPL_)SYS_MALLOC_F_LEN),0)
 obj-y += malloc_simple.o
 endif
+endif
 obj-y += image.o
 obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o
 obj-$(CONFIG_$(SPL_)OF_LIBFDT) += image-fdt.o
 
 
 static int initf_console_record(void)
 {
-#if defined(CONFIG_CONSOLE_RECORD) && defined(CONFIG_SYS_MALLOC_F_LEN)
+#if defined(CONFIG_CONSOLE_RECORD) && CONFIG_VAL(SYS_MALLOC_F_LEN)
        return console_record_init();
 #else
        return 0;
 
 static int initf_dm(void)
 {
-#if defined(CONFIG_DM) && defined(CONFIG_SYS_MALLOC_F_LEN)
+#if defined(CONFIG_DM) && CONFIG_VAL(SYS_MALLOC_F_LEN)
        int ret;
 
        bootstage_start(BOOTSTATE_ID_ACCUM_DM_F, "dm_f");
 
 {
        ulong malloc_start;
 
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#if CONFIG_VAL(SYS_MALLOC_F_LEN)
        debug("Pre-reloc malloc() used %#lx bytes (%ld KB)\n", gd->malloc_ptr,
              gd->malloc_ptr / 1024);
 #endif
 
 
   INTERNAL_SIZE_T nb;
 
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#if CONFIG_VAL(SYS_MALLOC_F_LEN)
        if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT))
                return malloc_simple(bytes);
 #endif
   mchunkptr fwd;       /* misc temp for linking */
   int       islr;      /* track whether merging with last_remainder */
 
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#if CONFIG_VAL(SYS_MALLOC_F_LEN)
        /* free() is a no-op - all the memory will be freed on relocation */
        if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT))
                return;
   /* realloc of null is supposed to be same as malloc */
   if (oldmem == NULL) return mALLOc(bytes);
 
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#if CONFIG_VAL(SYS_MALLOC_F_LEN)
        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");
     return NULL;
   else
   {
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#if CONFIG_VAL(SYS_MALLOC_F_LEN)
        if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) {
                MALLOC_ZERO(mem, sz);
                return mem;
 
 int initf_malloc(void)
 {
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#if CONFIG_VAL(SYS_MALLOC_F_LEN)
        assert(gd->malloc_base);        /* Set up by crt0.S */
-       gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN;
+       gd->malloc_limit = CONFIG_VAL(SYS_MALLOC_F_LEN);
        gd->malloc_ptr = 0;
 #endif
 
 
 ulong board_init_f_alloc_reserve(ulong top)
 {
        /* Reserve early malloc arena */
-#if defined(CONFIG_SYS_MALLOC_F)
-       top -= CONFIG_SYS_MALLOC_F_LEN;
+#if CONFIG_VAL(SYS_MALLOC_F_LEN)
+       top -= CONFIG_VAL(SYS_MALLOC_F_LEN);
 #endif
        /* LAST : reserve GD (rounded up to a multiple of 16 bytes) */
        top = rounddown(top-sizeof(struct global_data), 16);
         * Use gd as it is now properly set for all architectures.
         */
 
-#if defined(CONFIG_SYS_MALLOC_F)
+#if CONFIG_VAL(SYS_MALLOC_F_LEN)
        /* 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 += CONFIG_VAL(SYS_MALLOC_F_LEN);
 #endif
 }
 
 
 
        debug("spl_early_init()\n");
 
-#if defined(CONFIG_SYS_MALLOC_F_LEN)
+#if CONFIG_VAL(SYS_MALLOC_F_LEN)
        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 = CONFIG_VAL(SYS_MALLOC_F_LEN);
                gd->malloc_ptr = 0;
        }
 #endif
        default:
                debug("Unsupported OS image.. Jumping nevertheless..\n");
        }
-#if defined(CONFIG_SYS_MALLOC_F_LEN) && !defined(CONFIG_SYS_SPL_MALLOC_SIZE)
+#if CONFIG_VAL(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
        gd_t *new_gd;
        ulong ptr = CONFIG_SPL_STACK_R_ADDR;
 
-#ifdef CONFIG_SPL_SYS_MALLOC_SIMPLE
+#if defined(CONFIG_SPL_SYS_MALLOC_SIMPLE) && CONFIG_SPL_SYS_MALLOC_F_LEN
        if (CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN) {
                ptr -= CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN;
                gd->malloc_base = ptr;
 
          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"
          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
 
  */
 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"
+#if !CONFIG_VAL(SYS_MALLOC_F_LEN)
+#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)
 
 #endif
        unsigned int timebase_h;
        unsigned int timebase_l;
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#if CONFIG_VAL(SYS_MALLOC_F_LEN)
        unsigned long malloc_base;      /* base address of early malloc() */
        unsigned long malloc_limit;     /* limit address */
        unsigned long malloc_ptr;       /* current address */
 
        DEFINE(GD_SIZE, sizeof(struct global_data));
 
        DEFINE(GD_BD, offsetof(struct global_data, bd));
-#ifdef CONFIG_SYS_MALLOC_F_LEN
+#if CONFIG_VAL(SYS_MALLOC_F_LEN)
        DEFINE(GD_MALLOC_BASE, offsetof(struct global_data, malloc_base));
 #endif
 
 
                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, CONFIG_VAL(SYS_MALLOC_F_LEN),
                                            &ret);
        if (!gd->malloc_base)
                return ret;