mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 23:51:33 +00:00
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:
parent
2db9374561
commit
f0c7d9c746
3 changed files with 18 additions and 84 deletions
|
@ -136,8 +136,10 @@ static void load_gdt(const u64 *boot_gdt, u16 num_entries)
|
|||
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;
|
||||
|
||||
/* CS: code, read/execute, 4 GB, base 0 */
|
||||
|
|
|
@ -104,8 +104,7 @@ car_init_ret:
|
|||
*
|
||||
* 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
|
||||
|
@ -120,13 +119,10 @@ car_init_ret:
|
|||
* and esi holds the HOB list address returned by the FSP.
|
||||
*/
|
||||
#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)
|
||||
/* Set up global data */
|
||||
mov %esp, %eax
|
||||
call board_init_f_mem
|
||||
mov %eax, %esp
|
||||
|
||||
/*
|
||||
* Debug UART is available here although it may not be plumbed out
|
||||
|
@ -137,56 +133,21 @@ car_init_ret:
|
|||
* call printch
|
||||
*/
|
||||
|
||||
/* 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
|
||||
|
||||
/* Store HOB list */
|
||||
movl %esp, %edx
|
||||
addl $GD_HOB_LIST, %edx
|
||||
movl %esi, (%edx)
|
||||
movl %esi, GD_HOB_LIST(%edx)
|
||||
|
||||
skip_hob:
|
||||
#else
|
||||
/* Store table pointer */
|
||||
movl %esp, %edx
|
||||
addl $GD_TABLE, %edx
|
||||
movl %esi, (%edx)
|
||||
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)
|
||||
|
@ -213,37 +174,7 @@ board_init_f_r_trampoline:
|
|||
/* 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
|
||||
|
|
|
@ -715,6 +715,7 @@ static int jump_to_copy(void)
|
|||
* with the stack in SDRAM and Global Data in temporary memory
|
||||
* (CPU cache)
|
||||
*/
|
||||
arch_setup_gd(gd->new_gd);
|
||||
board_init_f_r_trampoline(gd->start_addr_sp);
|
||||
#else
|
||||
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;
|
||||
}
|
||||
#endif /* !CONFIG_X86 */
|
||||
|
||||
ulong board_init_f_mem(ulong top)
|
||||
{
|
||||
|
@ -1054,4 +1056,3 @@ ulong board_init_f_mem(ulong top)
|
|||
|
||||
return top;
|
||||
}
|
||||
#endif /* !CONFIG_X86 */
|
||||
|
|
Loading…
Reference in a new issue