mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
51de94dfe4
At present the debug UART is only set up in SPL, on the assumption that the boot flow will always pass through there. When booting from coreboot, SPL is not used, so the debug UART is not available. Move the code into a common place so that it can be used in U-Boot proper also. Add the required init to start_from_spl.S as well. Signed-off-by: Simon Glass <sjg@chromium.org>
89 lines
2.1 KiB
ArmAsm
89 lines
2.1 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
/*
|
|
* 32-bit x86 Startup Code when running from SPL. This is the startup code in
|
|
* U-Boot proper, when SPL is used.
|
|
|
|
* Copyright 2018 Google, Inc
|
|
* Written by Simon Glass <sjg@chromium.org>
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
.section .text.start
|
|
.code32
|
|
.globl _start
|
|
.type _start, @function
|
|
_start:
|
|
/*
|
|
* If running from coreboot, CAR is no-longer available. Use the
|
|
* existing stack, which is large enough.
|
|
*/
|
|
call locate_coreboot_table
|
|
cmp $0, %eax
|
|
jge use_existing_stack
|
|
|
|
movl $(CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE - 4), %eax
|
|
#ifdef CONFIG_DCACHE_RAM_MRC_VAR_SIZE
|
|
subl $CONFIG_DCACHE_RAM_MRC_VAR_SIZE, %eax
|
|
#endif
|
|
jmp 2f
|
|
/*
|
|
* We don't subtract CONFIG_DCACHE_RAM_MRC_VAR_SIZE since memory is
|
|
* already set up. This has the happy side-effect of putting gd in a
|
|
* new place separate from SPL, so the memset() in
|
|
* board_init_f_init_reserve() does not cause any problems (otherwise
|
|
* it would zero out the gd and crash)
|
|
*/
|
|
/* Set up memory using the existing stack */
|
|
use_existing_stack:
|
|
mov %esp, %eax
|
|
2:
|
|
call board_init_f_alloc_reserve
|
|
mov %eax, %esp
|
|
|
|
call board_init_f_init_reserve
|
|
|
|
#ifdef CONFIG_DEBUG_UART
|
|
call debug_uart_init
|
|
#endif
|
|
|
|
call x86_cpu_reinit_f
|
|
xorl %eax, %eax
|
|
call board_init_f
|
|
call board_init_f_r
|
|
|
|
/* Should not return here */
|
|
jmp .
|
|
|
|
.globl board_init_f_r_trampoline
|
|
.type board_init_f_r_trampoline, @function
|
|
board_init_f_r_trampoline:
|
|
/*
|
|
* SPL has been executed and SDRAM has been initialised, U-Boot code
|
|
* has been copied into RAM, BSS has been cleared and relocation
|
|
* adjustments have been made. It is now time to jump into the in-RAM
|
|
* copy of U-Boot
|
|
*
|
|
* %eax = Address of top of new stack
|
|
*/
|
|
|
|
/* Stack grows down from top of SDRAM */
|
|
movl %eax, %esp
|
|
|
|
/* Re-enter U-Boot by calling board_init_f_r() */
|
|
call board_init_f_r
|
|
|
|
die:
|
|
hlt
|
|
jmp die
|
|
hlt
|
|
|
|
.align 4
|
|
_dt_ucode_base_size:
|
|
/* These next two fields are filled in by binman */
|
|
.globl ucode_base
|
|
ucode_base: /* Declared in microcode.h */
|
|
.long 0 /* microcode base */
|
|
.globl ucode_size
|
|
ucode_size: /* Declared in microcode.h */
|
|
.long 0 /* microcode size */
|