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>
79 lines
1.7 KiB
C
79 lines
1.7 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Copyright (c) 2013, Google Inc.
|
|
*
|
|
* Copyright (C) 2011
|
|
* Corscience GmbH & Co. KG - Simon Schwarz <schwarz@corscience.de>
|
|
* - Added prep subcommand support
|
|
* - Reorganized source - modeled after powerpc version
|
|
*
|
|
* (C) Copyright 2002
|
|
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
|
|
* Marius Groeger <mgroeger@sysgo.de>
|
|
*
|
|
* Copyright (C) 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl)
|
|
*/
|
|
|
|
#include <fdt_support.h>
|
|
#ifdef CONFIG_ARMV7_NONSEC
|
|
#include <asm/armv7.h>
|
|
#endif
|
|
#include <asm/global_data.h>
|
|
#include <asm/psci.h>
|
|
#include <asm/spin_table.h>
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
#ifdef CONFIG_FMAN_ENET
|
|
__weak int fdt_update_ethernet_dt(void *blob)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
int arch_fixup_fdt(void *blob)
|
|
{
|
|
__maybe_unused int ret = 0;
|
|
#if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_OF_LIBFDT)
|
|
int bank;
|
|
u64 start[CONFIG_NR_DRAM_BANKS];
|
|
u64 size[CONFIG_NR_DRAM_BANKS];
|
|
|
|
for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
|
|
start[bank] = gd->dram[bank].start;
|
|
size[bank] = gd->dram[bank].size;
|
|
#ifdef CONFIG_ARMV7_NONSEC
|
|
ret = armv7_apply_memory_carveout(&start[bank], &size[bank]);
|
|
if (ret)
|
|
return ret;
|
|
#endif
|
|
}
|
|
|
|
#ifdef CONFIG_OF_LIBFDT
|
|
ret = fdt_fixup_memory_banks(blob, start, size, CONFIG_NR_DRAM_BANKS);
|
|
if (ret)
|
|
return ret;
|
|
#endif
|
|
|
|
#ifdef CONFIG_ARMV8_SPIN_TABLE
|
|
ret = spin_table_update_dt(blob);
|
|
if (ret)
|
|
return ret;
|
|
#endif
|
|
|
|
#if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV8_PSCI) || \
|
|
CONFIG_IS_ENABLED(SEC_FIRMWARE_ARMV8_PSCI)
|
|
ret = psci_update_dt(blob);
|
|
if (ret)
|
|
return ret;
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_FMAN_ENET
|
|
ret = fdt_update_ethernet_dt(blob);
|
|
if (ret)
|
|
return ret;
|
|
#endif
|
|
return 0;
|
|
}
|