Browse Source

x86: fsp: Enlarge the size of malloc() pool before relocation

After fsp_init() returns, the stack has already been switched to a
place within system memory as defined by CONFIG_FSP_TEMP_RAM_ADDR.
Enlarge the size of malloc() pool before relocation since we have
plenty of memory now.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Simon Glass <sjg@chromium.org>
Bin Meng 9 years ago
parent
commit
57b10f59b7
3 changed files with 30 additions and 1 deletions
  1. 7 0
      arch/x86/Kconfig
  2. 8 0
      arch/x86/cpu/start.S
  3. 15 1
      arch/x86/lib/fsp/fsp_common.c

+ 7 - 0
arch/x86/Kconfig

@@ -232,6 +232,13 @@ config FSP_TEMP_RAM_ADDR
 	  Stack top address which is used in FspInit after DRAM is ready and
 	  Stack top address which is used in FspInit after DRAM is ready and
 	  CAR is disabled.
 	  CAR is disabled.
 
 
+config FSP_SYS_MALLOC_F_LEN
+	hex
+	depends on HAVE_FSP
+	default 0x100000
+	help
+	  Additional size of malloc() pool before relocation.
+
 config SMP
 config SMP
 	bool "Enable Symmetric Multiprocessing"
 	bool "Enable Symmetric Multiprocessing"
 	default n
 	default n

+ 8 - 0
arch/x86/cpu/start.S

@@ -141,6 +141,14 @@ car_init_ret:
 	jz	skip_hob
 	jz	skip_hob
 	movl	%esi, GD_HOB_LIST(%edx)
 	movl	%esi, GD_HOB_LIST(%edx)
 
 
+	/*
+	 * After fsp_init() returns, the stack has already been switched to a
+	 * place within system memory as defined by CONFIG_FSP_TEMP_RAM_ADDR.
+	 * Enlarge the size of malloc() pool before relocation since we have
+	 * plenty of memory now.
+	 */
+	subl	$CONFIG_FSP_SYS_MALLOC_F_LEN, %esp
+	movl	%esp, GD_MALLOC_BASE(%edx)
 skip_hob:
 skip_hob:
 #else
 #else
 	/* Store table pointer */
 	/* Store table pointer */

+ 15 - 1
arch/x86/lib/fsp/fsp_common.c

@@ -56,8 +56,22 @@ void board_final_cleanup(void)
 
 
 int x86_fsp_init(void)
 int x86_fsp_init(void)
 {
 {
-	if (!gd->arch.hob_list)
+	if (!gd->arch.hob_list) {
+		/*
+		 * The first time we enter here, call fsp_init().
+		 * Note the execution does not return to this function,
+		 * instead it jumps to fsp_continue().
+		 */
 		fsp_init(CONFIG_FSP_TEMP_RAM_ADDR, BOOT_FULL_CONFIG, NULL);
 		fsp_init(CONFIG_FSP_TEMP_RAM_ADDR, BOOT_FULL_CONFIG, NULL);
+	} else {
+		/*
+		 * The second time we enter here, adjust the size of malloc()
+		 * pool before relocation. Given gd->malloc_base was adjusted
+		 * after the call to board_init_f_mem() in arch/x86/cpu/start.S,
+		 * we should fix up gd->malloc_limit here.
+		 */
+		gd->malloc_limit += CONFIG_FSP_SYS_MALLOC_F_LEN;
+	}
 
 
 	return 0;
 	return 0;
 }
 }