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/sections.h> 11 12 DECLARE_GLOBAL_DATA_PTR; 13 14 /* Get the top of usable RAM */ 15 __weak ulong board_get_usable_ram_top(ulong total_size) 16 { 17 return gd->ram_size; 18 } 19 20 int calculate_relocation_address(void) 21 { 22 const ulong uboot_size = (uintptr_t)&__bss_end - 23 (uintptr_t)&__text_start; 24 ulong total_size; 25 ulong dest_addr; 26 ulong fdt_size = 0; 27 28 #if defined(CONFIG_OF_SEPARATE) && defined(CONFIG_OF_CONTROL) 29 if (gd->fdt_blob) 30 fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, 32); 31 #endif 32 total_size = ALIGN(uboot_size, 1 << 12) + CONFIG_SYS_MALLOC_LEN + 33 CONFIG_SYS_STACK_SIZE + fdt_size; 34 35 dest_addr = board_get_usable_ram_top(total_size); 36 /* 37 * NOTE: All destination address are rounded down to 16-byte 38 * boundary to satisfy various worst-case alignment 39 * requirements 40 */ 41 dest_addr &= ~15; 42 43 #if defined(CONFIG_OF_SEPARATE) && defined(CONFIG_OF_CONTROL) 44 /* 45 * If the device tree is sitting immediate above our image then we 46 * must relocate it. If it is embedded in the data section, then it 47 * will be relocated with other data. 48 */ 49 if (gd->fdt_blob) { 50 dest_addr -= fdt_size; 51 gd->new_fdt = (void *)dest_addr; 52 dest_addr &= ~15; 53 } 54 #endif 55 /* U-Boot is below the FDT */ 56 dest_addr -= uboot_size; 57 dest_addr &= ~((1 << 12) - 1); 58 gd->relocaddr = dest_addr; 59 gd->reloc_off = dest_addr - (uintptr_t)&__text_start; 60 61 /* Stack is at the bottom, so it can grow down */ 62 gd->start_addr_sp = dest_addr - CONFIG_SYS_MALLOC_LEN; 63 64 return 0; 65 } 66 67 int init_cache_f_r(void) 68 { 69 /* Initialise the CPU cache(s) */ 70 return init_cache(); 71 } 72 73 bd_t bd_data; 74 75 int init_bd_struct_r(void) 76 { 77 gd->bd = &bd_data; 78 memset(gd->bd, 0, sizeof(bd_t)); 79 80 return 0; 81 } 82 83 int init_func_spi(void) 84 { 85 puts("SPI: "); 86 spi_init(); 87 puts("ready\n"); 88 return 0; 89 } 90 91 int find_fdt(void) 92 { 93 #ifdef CONFIG_OF_EMBED 94 /* Get a pointer to the FDT */ 95 gd->fdt_blob = __dtb_dt_begin; 96 #elif defined CONFIG_OF_SEPARATE 97 /* FDT is at end of image */ 98 gd->fdt_blob = (ulong *)&_end; 99 #endif 100 /* Allow the early environment to override the fdt address */ 101 gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16, 102 (uintptr_t)gd->fdt_blob); 103 104 return 0; 105 } 106 107 int prepare_fdt(void) 108 { 109 /* For now, put this check after the console is ready */ 110 if (fdtdec_prepare_fdt()) { 111 panic("** CONFIG_OF_CONTROL defined but no FDT - please see " 112 "doc/README.fdt-control"); 113 } 114 115 return 0; 116 } 117