diff --git a/Kconfig b/Kconfig
index b4ad610f613037a6176196af1928671868772f50..44b144f1c2a0aa609deaec7526da2a8c224b7799 100644
--- a/Kconfig
+++ b/Kconfig
@@ -142,6 +142,16 @@ config SPL_STACK_R_ADDR
 	  Specify the address in SDRAM for the SPL stack. This will be set up
 	  before board_init_r() is called.
 
+config SPL_STACK_R_MALLOC_SIMPLE_LEN
+	depends on SPL_STACK_R && SPL_SYS_MALLOC_SIMPLE
+	hex "Size of malloc_simple heap after switching to DRAM SPL stack"
+	default 0x100000
+	help
+	  Specify the amount of the stack to use as memory pool for
+	  malloc_simple after switching the stack to DRAM. This may be set
+	  to give board_init_r() a larger heap then the initial heap in
+	  SRAM which is limited to SYS_MALLOC_F_LEN bytes.
+
 config TPL
 	bool
 	depends on SPL && SUPPORT_TPL
diff --git a/common/spl/spl.c b/common/spl/spl.c
index b09a6268e623c3f4b23b69c80c68687ea48ec131..4b319d6739d2f735430cd5f7d539f30085811047 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -347,6 +347,18 @@ ulong spl_relocate_stack_gd(void)
 	memcpy(new_gd, (void *)gd, sizeof(gd_t));
 	gd = new_gd;
 
+#ifdef CONFIG_SPL_SYS_MALLOC_SIMPLE
+	if (CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN) {
+		if (!(gd->flags & GD_FLG_SPL_INIT))
+			panic("spl_init must be called before heap reloc");
+
+		ptr -= CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN;
+		gd->malloc_base = ptr;
+		gd->malloc_limit = CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN;
+		gd->malloc_ptr = 0;
+	}
+#endif
+
 	return ptr;
 #else
 	return 0;