Currently, the bi_dram[] information is stored in the board info structure (bd). Because bd is only valid after reserve_board(), dram_init_banksize() must be called late in the initialization process. This limitation is problematic, as it forces us to rely on a variety of bespoke functions to determine board RAM, bank memory sizes, and other early setup requirements. By moving bi_dram[] into the global data (gd), we can run it earlier. This is particularly convenient since boards define their own dram_init_banksize() routines, which do not always rely on parsing Device Tree (DT) memory nodes. Additionally, U-Boot defaults to relocating to the top of the first memory bank. While boards currently use custom functions to override this behavior, having the DRAM bank information available earlier in gd makes relocating to a different bank trivial and standardizes the process. Reviewed-by: Anshul Dalal <anshuld@ti.com> Tested-by: Michal Simek <michal.simek@amd.com> # Versal Gen 2 Vek385 Tested-by: Anshul Dalal <anshuld@ti.com> Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Tested-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org>
85 lines
1.5 KiB
C
85 lines
1.5 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Copyright (C) 2019
|
|
* Author(s): Giulio Benetti <giulio.benetti@benettiengineering.com>
|
|
*/
|
|
|
|
#include <dm.h>
|
|
#include <init.h>
|
|
#include <log.h>
|
|
#include <ram.h>
|
|
#include <spl.h>
|
|
#include <asm/global_data.h>
|
|
#include <asm/io.h>
|
|
#include <asm/armv7m.h>
|
|
#include <serial.h>
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
int dram_init(void)
|
|
{
|
|
#ifndef CONFIG_SUPPORT_SPL
|
|
int rv;
|
|
struct udevice *dev;
|
|
|
|
rv = uclass_get_device(UCLASS_RAM, 0, &dev);
|
|
if (rv) {
|
|
debug("DRAM init failed: %d\n", rv);
|
|
return rv;
|
|
}
|
|
|
|
#endif
|
|
return fdtdec_setup_mem_size_base();
|
|
}
|
|
|
|
int dram_init_banksize(void)
|
|
{
|
|
return fdtdec_setup_memory_banksize();
|
|
}
|
|
|
|
#ifdef CONFIG_XPL_BUILD
|
|
#ifdef CONFIG_SPL_OS_BOOT
|
|
int spl_start_uboot(void)
|
|
{
|
|
debug("SPL: booting kernel\n");
|
|
/* break into full u-boot on 'c' */
|
|
return serial_tstc() && serial_getc() == 'c';
|
|
}
|
|
#endif
|
|
|
|
int spl_dram_init(void)
|
|
{
|
|
struct udevice *dev;
|
|
int rv;
|
|
|
|
rv = uclass_get_device(UCLASS_RAM, 0, &dev);
|
|
if (rv)
|
|
debug("DRAM init failed: %d\n", rv);
|
|
return rv;
|
|
}
|
|
|
|
void spl_board_init(void)
|
|
{
|
|
preloader_console_init();
|
|
spl_dram_init();
|
|
arch_cpu_init(); /* to configure mpu for sdram rw permissions */
|
|
}
|
|
|
|
u32 spl_boot_device(void)
|
|
{
|
|
/* There is no way to find the boot device so look if there is a valid IVT in RAM for MMC */
|
|
u32 nor_ivt = *(u32 *)(CONFIG_SYS_LOAD_ADDR - 0xC00);
|
|
|
|
if (nor_ivt == 0x402000d1)
|
|
return BOOT_DEVICE_MMC1;
|
|
return BOOT_DEVICE_NOR;
|
|
}
|
|
#endif
|
|
|
|
int board_init(void)
|
|
{
|
|
gd->bd->bi_boot_params = gd->dram[0].start + 0x100;
|
|
|
|
return 0;
|
|
}
|