x86: Switch to using generic global_data setup

There is quite a bit of assembler code that can be removed if we use the
generic global_data setup. Less arch-specific code makes it easier to add
new features and maintain the start-up code.

Drop the unneeded code and adjust the hooks in board_f.c to cope.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
Simon Glass 2015-08-10 20:44:32 -06:00
parent 2db9374561
commit f0c7d9c746
3 changed files with 18 additions and 84 deletions

View File

@ -136,8 +136,10 @@ static void load_gdt(const u64 *boot_gdt, u16 num_entries)
asm volatile("lgdtl %0\n" : : "m" (gdt)); asm volatile("lgdtl %0\n" : : "m" (gdt));
} }
void setup_gdt(gd_t *new_gd, u64 *gdt_addr) void arch_setup_gd(gd_t *new_gd)
{ {
u64 *gdt_addr;
gdt_addr = new_gd->arch.gdt; gdt_addr = new_gd->arch.gdt;
/* CS: code, read/execute, 4 GB, base 0 */ /* CS: code, read/execute, 4 GB, base 0 */

View File

@ -104,8 +104,7 @@ car_init_ret:
* *
* top-> CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE * top-> CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE
* MRC area * MRC area
* global_data * global_data with x86 global descriptor table
* x86 global descriptor table
* early malloc area * early malloc area
* stack * stack
* bottom-> CONFIG_SYS_CAR_ADDR * bottom-> CONFIG_SYS_CAR_ADDR
@ -120,13 +119,10 @@ car_init_ret:
* and esi holds the HOB list address returned by the FSP. * and esi holds the HOB list address returned by the FSP.
*/ */
#endif #endif
/* Set up global data */
/* Reserve space on stack for global data */ mov %esp, %eax
subl $GENERATED_GBL_DATA_SIZE, %esp call board_init_f_mem
mov %eax, %esp
/* Align global data to 16-byte boundary */
andl $0xfffffff0, %esp
post_code(POST_START_STACK)
/* /*
* Debug UART is available here although it may not be plumbed out * Debug UART is available here although it may not be plumbed out
@ -137,56 +133,21 @@ car_init_ret:
* call printch * call printch
*/ */
/* Zero the global data since it won't happen later */ /* Get address of global_data */
xorl %eax, %eax mov %fs:0, %edx
movl $GENERATED_GBL_DATA_SIZE, %ecx
movl %esp, %edi
rep stosb
#ifdef CONFIG_HAVE_FSP #ifdef CONFIG_HAVE_FSP
/* Store the HOB list if we have one */
test %esi, %esi test %esi, %esi
jz skip_hob jz skip_hob
movl %esi, GD_HOB_LIST(%edx)
/* Store HOB list */
movl %esp, %edx
addl $GD_HOB_LIST, %edx
movl %esi, (%edx)
skip_hob: skip_hob:
#else #else
/* Store table pointer */ /* Store table pointer */
movl %esp, %edx movl %esi, GD_TABLE(%edx)
addl $GD_TABLE, %edx
movl %esi, (%edx)
#endif #endif
/* Store BIST */
/* Setup first parameter to setup_gdt, pointer to global_data */ movl %ebp, GD_BIST(%edx)
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
/* Set parameter to board_init_f() to boot flags */ /* Set parameter to board_init_f() to boot flags */
post_code(POST_START_DONE) post_code(POST_START_DONE)
@ -213,37 +174,7 @@ board_init_f_r_trampoline:
/* Stack grows down from top of SDRAM */ /* Stack grows down from top of SDRAM */
movl %eax, %esp movl %eax, %esp
/* Reserve space on stack for global data */ /* See if we need to disable CAR */
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 */
.weak car_uninit .weak car_uninit
movl $car_uninit, %eax movl $car_uninit, %eax
cmpl $0, %eax cmpl $0, %eax

View File

@ -715,6 +715,7 @@ static int jump_to_copy(void)
* with the stack in SDRAM and Global Data in temporary memory * with the stack in SDRAM and Global Data in temporary memory
* (CPU cache) * (CPU cache)
*/ */
arch_setup_gd(gd->new_gd);
board_init_f_r_trampoline(gd->start_addr_sp); board_init_f_r_trampoline(gd->start_addr_sp);
#else #else
relocate_code(gd->start_addr_sp, gd->new_gd, gd->relocaddr); relocate_code(gd->start_addr_sp, gd->new_gd, gd->relocaddr);
@ -1033,6 +1034,7 @@ __weak void arch_setup_gd(struct global_data *gd_ptr)
{ {
gd = gd_ptr; gd = gd_ptr;
} }
#endif /* !CONFIG_X86 */
ulong board_init_f_mem(ulong top) ulong board_init_f_mem(ulong top)
{ {
@ -1054,4 +1056,3 @@ ulong board_init_f_mem(ulong top)
return top; return top;
} }
#endif /* !CONFIG_X86 */