/* Tell 32-bit code it is being entered from an in-RAM copy */
movl $GD_FLG_WARM_BOOT, %ebx
+
+ /*
+ * Zero the BIST (Built-In Self Test) value since we don't have it.
+ * It must be 0 or the previous loader would have reported an error.
+ */
+ movl $0, %ebp
+
jmp 1f
/* Add a way for tools to discover the _start entry point */
* Set %ebx to GD_FLG_COLD_BOOT to indicate this.
*/
movl $GD_FLG_COLD_BOOT, %ebx
-1:
+
/* Save BIST */
movl %eax, %ebp
+1:
+
+ /* Save table pointer */
+ movl %ecx, %esi
/* Load the segement registers to match the GDT loaded in start16.S */
movl $(X86_GDT_ENTRY_32BIT_DS * X86_GDT_ENTRY_SIZE), %eax
*
* top-> CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE
* MRC area
- * global_data
- * x86 global descriptor table
+ * global_data with x86 global descriptor table
* early malloc area
* stack
* bottom-> CONFIG_SYS_CAR_ADDR
#endif
#else
/*
- * When we get here after car_init(), esp points to a temporary stack
- * and esi holds the HOB list address returned by the FSP.
+ * U-Boot enters here twice. For the first time it comes from
+ * car_init_done() with esp points to a temporary stack and esi
+ * set to zero. For the second time it comes from fsp_init_done()
+ * with esi holding the HOB list address returned by the FSP.
*/
#endif
+ /* Set up global data */
+ mov %esp, %eax
+ call board_init_f_alloc_reserve
+ mov %eax, %esp
+ call board_init_f_init_reserve
+
+#ifdef CONFIG_DEBUG_UART
+ call debug_uart_init
+#endif
- /* Reserve space on stack for global data */
- subl $GENERATED_GBL_DATA_SIZE, %esp
-
- /* Align global data to 16-byte boundary */
- andl $0xfffffff0, %esp
- post_code(POST_START_STACK)
-
- /* Zero the global data since it won't happen later */
- xorl %eax, %eax
- movl $GENERATED_GBL_DATA_SIZE, %ecx
- movl %esp, %edi
- rep stosb
-
+ /* Get address of global_data */
+ mov %fs:0, %edx
#ifdef CONFIG_HAVE_FSP
+ /* Store the HOB list if we have one */
test %esi, %esi
jz skip_hob
+ movl %esi, GD_HOB_LIST(%edx)
- /* Store HOB list */
- movl %esp, %edx
- addl $GD_HOB_LIST, %edx
- movl %esi, (%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:
+#else
+ /* Store table pointer */
+ movl %esi, GD_TABLE(%edx)
#endif
- /* Setup first parameter to setup_gdt, pointer to global_data */
- movl %esp, %eax
-
- /* Reserve space for global descriptor table */
- subl $X86_GDT_SIZE, %esp
-
- /* Align temporary global descriptor table to 16-byte boundary */
- andl $0xfffffff0, %esp
- movl %esp, %ecx
-
-#if defined(CONFIG_SYS_MALLOC_F_LEN)
- /* Set up the pre-relocation malloc pool */
- subl $CONFIG_SYS_MALLOC_F_LEN, %esp
- movl %eax, %edx
- addl $GD_MALLOC_BASE, %edx
- movl %esp, (%edx)
-#endif
- /* Store BIST into global_data */
- movl %eax, %edx
- addl $GD_BIST, %edx
- movl %ebp, (%edx)
-
- /* Set second parameter to setup_gdt() */
- movl %ecx, %edx
-
- /* Setup global descriptor table so gd->xyz works */
- call setup_gdt
+ /* Store BIST */
+ movl %ebp, GD_BIST(%edx)
/* Set parameter to board_init_f() to boot flags */
post_code(POST_START_DONE)
/* Stack grows down from top of SDRAM */
movl %eax, %esp
- /* Reserve space on stack for global data */
- subl $GENERATED_GBL_DATA_SIZE, %esp
-
- /* Align global data to 16-byte boundary */
- andl $0xfffffff0, %esp
-
- /* Setup first parameter to memcpy() and setup_gdt() */
- movl %esp, %eax
-
- /* Setup second parameter to memcpy() */
- fs movl 0, %edx
-
- /* Set third parameter to memcpy() */
- movl $GENERATED_GBL_DATA_SIZE, %ecx
-
- /* Copy global data from CAR to SDRAM stack */
- call memcpy
-
- /* Reserve space for global descriptor table */
- subl $X86_GDT_SIZE, %esp
-
- /* Align global descriptor table to 16-byte boundary */
- andl $0xfffffff0, %esp
-
- /* Set second parameter to setup_gdt() */
- movl %esp, %edx
-
- /* Setup global descriptor table so gd->xyz works */
- call setup_gdt
-
- /* Set if we need to disable CAR */
+ /* See if we need to disable CAR */
.weak car_uninit
movl $car_uninit, %eax
cmpl $0, %eax