Offset of the read-write memory which contains data, from read-only
memory which contains executable text.
+config RELOC_ADDR_TOP
+ bool "Relocate to the topmost memory address"
+ help
+ When U-Boot relocates, it chooses the end of the first memory bank.
+ Enable this if you have multiple banks and want U-Boot to relocate
+ to the topmost memory address. This will use the information of the
+ board memory banks configured with dram_init_banksize() to calculate
+ the relocation address.
+ Use this if you are certain all of the devices can access memory
+ above the 32bit boundary. Devices that can only DMA below 4GiB will
+ misbehave because their buffers may be allocated above the 32-bit
+ boundary after relocation.
+
endif # EXPERT
config PHYS_64BIT
#include <log.h>
#include <malloc.h>
#include <mapmem.h>
+#include <memtop.h>
#include <os.h>
#include <post.h>
#include <relocate.h>
#include <dm/root.h>
#include <linux/errno.h>
#include <linux/log2.h>
+#include <linux/sizes.h>
DECLARE_GLOBAL_DATA_PTR;
/* Get the top of usable RAM */
__weak phys_addr_t board_get_usable_ram_top(phys_size_t total_size)
{
+ if (CONFIG_IS_ENABLED(RELOC_ADDR_TOP))
+ return gd->ram_top;
+
#if defined(CFG_SYS_SDRAM_BASE) && CFG_SYS_SDRAM_BASE > 0
/*
* Detect whether we have so much RAM that it goes past the end of our
static int setup_ram_config(void)
{
debug("Monitor len: %08x\n", gd->mon_len);
-#if CONFIG_VAL(SYS_MEM_TOP_HIDE)
+
+ if (CONFIG_IS_ENABLED(RELOC_ADDR_TOP)) {
+ int i;
+ phys_addr_t top;
+
+ gd->ram_size = 0;
+ for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+ top = get_mem_top(gd->dram[i].start, gd->dram[i].size,
+ ALIGN(gd->mon_len, SZ_1M),
+ (void *)gd->fdt_blob);
+ gd->ram_top = max(top, gd->ram_top);
+ gd->ram_size += gd->dram[i].size;
+ }
+ } else {
+ gd->ram_top = gd->ram_base + get_effective_memsize();
+ }
+ gd->ram_top = board_get_usable_ram_top(gd->mon_len);
/*
* Subtract specified amount of memory to hide so that it won't
* get "touched" at all by U-Boot. By fixing up gd->ram_size
* memory size from the SDRAM controller setup will have to
* get fixed.
*/
+#if CONFIG_VAL(SYS_MEM_TOP_HIDE)
+ gd->ram_top -= CONFIG_SYS_MEM_TOP_HIDE;
gd->ram_size -= CONFIG_SYS_MEM_TOP_HIDE;
#endif
- gd->ram_top = gd->ram_base + get_effective_memsize();
- gd->ram_top = board_get_usable_ram_top(gd->mon_len);
debug("Ram top: %08llx\n", (unsigned long long)gd->ram_top);
debug("Ram size: %08llx\n", (unsigned long long)gd->ram_size);
* - board info struct
*/
INITCALL(setup_ram_base);
+ INITCALL(dram_init_banksize);
INITCALL(setup_ram_config);
INITCALL(setup_dest_addr);
#if CONFIG_IS_ENABLED(OF_BOARD_FIXUP) && \
INITCALL(reserve_bloblist);
INITCALL(reserve_arch);
INITCALL(reserve_stacks);
- INITCALL(dram_init_banksize);
INITCALL(show_dram_config);
WATCHDOG_RESET();
INITCALL(setup_bdinfo);