blob: 801e96336bc9579a4e3171b641873d08472cb5e7 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
#include <arch/exception.h>
#include <arch/stages.h>
#include <cbmem.h>
#include <console/console.h>
#include <lib.h>
#include <program_loading.h>
#include <romstage_common.h>
#include <soc/addressmap.h>
#include <soc/ccplex.h>
#include <soc/clock.h>
#include <soc/nvidia/tegra/apbmisc.h>
#include <soc/romstage.h>
#include <soc/sdram.h>
#include <soc/sdram_configs.h>
#include <symbols.h>
#include <vendorcode/google/chromeos/chromeos.h>
void __weak romstage_mainboard_init(void)
{
/* Default empty implementation. */
}
void romstage(void)
{
console_init();
exception_init();
romstage_main();
}
void __noreturn romstage_main(void)
{
printk(BIOS_INFO, "T210: romstage here\n");
#if CONFIG(BOOTROM_SDRAM_INIT)
printk(BIOS_INFO, "T210 romstage: SDRAM init done by BootROM, RAMCODE = %d\n",
sdram_get_ram_code());
#else
sdram_init(get_sdram_config());
printk(BIOS_INFO, "T210 romstage: sdram_init done\n");
#endif
/*
* IMPORTANT:
* DO NOT INITIALIZE ANY CARVEOUT BEFORE TZ.
*
* Trust Zone needs to be initialized after the DRAM initialization
* because carveout registers are programmed during DRAM init.
* cbmem_initialize() is dependent on the Trust Zone region
* initialization because CBMEM lives right below the Trust Zone which
* needs to be properly identified.
*/
trustzone_region_init();
/* Now do various other carveouts */
gpu_region_init();
nvdec_region_init();
tsec_region_init();
vpr_region_init();
/*
* When romstage is running it's always on the reboot path -- never a
* resume path where cbmem recovery is required. Therefore, always
* initialize the cbmem area to be empty.
*/
cbmem_initialize_empty();
ccplex_cpu_prepare();
printk(BIOS_INFO, "T210 romstage: CPU prepare done\n");
romstage_mainboard_init();
run_ramstage();
}
void platform_prog_run(struct prog *prog)
{
/* We'll switch to a new stack, so validate our old one here. */
checkstack(_estack, 0);
ccplex_cpu_start(prog_entry(prog));
clock_halt_avp();
}