1 /* 2 * (C) Copyright 2011 3 * Graeme Russ, <graeme.russ@gmail.com> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 #include <common.h> 8 #include <fdtdec.h> 9 #include <spi.h> 10 #include <asm/mtrr.h> 11 #include <asm/sections.h> 12 13 DECLARE_GLOBAL_DATA_PTR; 14 15 /* Get the top of usable RAM */ 16 __weak ulong board_get_usable_ram_top(ulong total_size) 17 { 18 return gd->ram_size; 19 } 20 21 int calculate_relocation_address(void) 22 { 23 const ulong uboot_size = (uintptr_t)&__bss_end - 24 (uintptr_t)&__text_start; 25 ulong total_size; 26 ulong dest_addr; 27 ulong fdt_size = 0; 28 29 #if defined(CONFIG_OF_SEPARATE) && defined(CONFIG_OF_CONTROL) 30 if (gd->fdt_blob) 31 fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, 32); 32 #endif 33 total_size = ALIGN(uboot_size, 1 << 12) + CONFIG_SYS_MALLOC_LEN + 34 CONFIG_SYS_STACK_SIZE + fdt_size; 35 36 dest_addr = board_get_usable_ram_top(total_size); 37 /* 38 * NOTE: All destination address are rounded down to 16-byte 39 * boundary to satisfy various worst-case alignment 40 * requirements 41 */ 42 dest_addr &= ~15; 43 44 #if defined(CONFIG_OF_SEPARATE) && defined(CONFIG_OF_CONTROL) 45 /* 46 * If the device tree is sitting immediate above our image then we 47 * must relocate it. If it is embedded in the data section, then it 48 * will be relocated with other data. 49 */ 50 if (gd->fdt_blob) { 51 dest_addr -= fdt_size; 52 gd->new_fdt = (void *)dest_addr; 53 dest_addr &= ~15; 54 } 55 #endif 56 /* U-Boot is below the FDT */ 57 dest_addr -= uboot_size; 58 dest_addr &= ~((1 << 12) - 1); 59 gd->relocaddr = dest_addr; 60 gd->reloc_off = dest_addr - (uintptr_t)&__text_start; 61 62 /* Stack is at the bottom, so it can grow down */ 63 gd->start_addr_sp = dest_addr - CONFIG_SYS_MALLOC_LEN; 64 65 return 0; 66 } 67 68 int init_cache_f_r(void) 69 { 70 #if defined(CONFIG_X86_RESET_VECTOR) & !defined(CONFIG_HAVE_FSP) 71 int ret; 72 73 ret = mtrr_commit(false); 74 if (ret) 75 return ret; 76 #endif 77 /* Initialise the CPU cache(s) */ 78 return init_cache(); 79 } 80 81 bd_t bd_data; 82 83 int init_bd_struct_r(void) 84 { 85 gd->bd = &bd_data; 86 memset(gd->bd, 0, sizeof(bd_t)); 87 88 return 0; 89 } 90 91 int init_func_spi(void) 92 { 93 puts("SPI: "); 94 spi_init(); 95 puts("ready\n"); 96 return 0; 97 } 98