arm64: provide early SoC initialization
Some of the SoC's need an early hook to configure certain registers. One example of this is on t132 where ramstage is the first thing being ran on the arm64 core and it is the only entity that can configure certain registers required for the rest of ramstage. Therefore, provide the opportunity for the SoC to implement such requirements. BUG=chrome-os-partner:30572 BRANCH=None TEST=Built and ran through coreboot. Change-Id: Ib352f3788872f888581b398c9b394b7c4e54b02a Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/208061 Reviewed-by: Tom Warren <twarren@nvidia.com> Reviewed-by: Furquan Shaikh <furquan@chromium.org> Commit-Queue: Furquan Shaikh <furquan@chromium.org>
This commit is contained in:
parent
6f1de0e7fd
commit
2c50e2b39e
4 changed files with 45 additions and 1 deletions
|
|
@ -49,6 +49,8 @@ bootblock-$(CONFIG_BOOTBLOCK_CONSOLE) += early_console.c
|
|||
bootblock-y += id.S
|
||||
$(obj)/arch/arm64/id.bootblock.o: $(obj)/build.h
|
||||
|
||||
bootblock-y += c_entry.c
|
||||
bootblock-y += stage_entry.S
|
||||
bootblock-y += stages.c
|
||||
bootblock-y += eabi_compat.c
|
||||
|
||||
|
|
@ -74,6 +76,8 @@ endif # CONFIG_ARCH_BOOTBLOCK_ARM64
|
|||
|
||||
ifeq ($(CONFIG_ARCH_ROMSTAGE_ARM64),y)
|
||||
|
||||
romstage-y += c_entry.c
|
||||
romstage-y += stage_entry.S
|
||||
romstage-y += stages.c
|
||||
romstage-y += div0.c
|
||||
romstage-$(CONFIG_EARLY_CONSOLE) += early_console.c
|
||||
|
|
@ -101,6 +105,7 @@ endif # CONFIG_ARCH_ROMSTAGE_ARM64
|
|||
|
||||
ifeq ($(CONFIG_ARCH_RAMSTAGE_ARM64),y)
|
||||
|
||||
ramstage-y += c_entry.c
|
||||
ramstage-y += stages.c
|
||||
ramstage-y += div0.c
|
||||
ramstage-y += cpu.c
|
||||
|
|
|
|||
31
src/arch/arm64/c_entry.c
Normal file
31
src/arch/arm64/c_entry.c
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright 2014 Google Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <arch/stages.h>
|
||||
|
||||
void __attribute__((weak)) arm64_soc_init(void)
|
||||
{
|
||||
/* Default weak implementation does nothing. */
|
||||
}
|
||||
|
||||
void arm64_init(void)
|
||||
{
|
||||
arm64_soc_init();
|
||||
main();
|
||||
}
|
||||
|
|
@ -26,4 +26,12 @@ void stage_entry(void);
|
|||
void stage_exit(void *);
|
||||
void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size);
|
||||
|
||||
/* C entry point for all arm64 stages. */
|
||||
void arm64_init(void);
|
||||
|
||||
/* This function is called upon intial entry of each stage. It is called prior
|
||||
* to main(). That means all of the common infrastructure will most likely not
|
||||
* be available to be used (such as console). */
|
||||
void arm64_soc_init(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ ENTRY(arm64_el3_startup)
|
|||
.stack:
|
||||
.quad _estack
|
||||
.entry:
|
||||
.quad main
|
||||
.quad arm64_init
|
||||
ENDPROC(arm64_el3_startup)
|
||||
.global arm64_el3_startup_end
|
||||
arm64_el3_startup_end:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue