1d47ab0ecSGraeme Russ /* 2d47ab0ecSGraeme Russ * (C) Copyright 2011 3d47ab0ecSGraeme Russ * Graeme Russ, <graeme.russ@gmail.com> 4d47ab0ecSGraeme Russ * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 6d47ab0ecSGraeme Russ */ 7d47ab0ecSGraeme Russ #include <common.h> 8f697d528SSimon Glass #include <fdtdec.h> 98313315bSGabe Black #include <spi.h> 10*3b621ccaSBin Meng #include <asm/errno.h> 11db55bd7dSSimon Glass #include <asm/mtrr.h> 1286cfb6bdSSimon Glass #include <asm/sections.h> 13d47ab0ecSGraeme Russ 14d47ab0ecSGraeme Russ DECLARE_GLOBAL_DATA_PTR; 15d47ab0ecSGraeme Russ 165e98947fSSimon Glass /* Get the top of usable RAM */ 175e98947fSSimon Glass __weak ulong board_get_usable_ram_top(ulong total_size) 18a1d57b7aSGraeme Russ { 195e98947fSSimon Glass return gd->ram_size; 205e98947fSSimon Glass } 215e98947fSSimon Glass 225e98947fSSimon Glass int calculate_relocation_address(void) 235e98947fSSimon Glass { 245e98947fSSimon Glass const ulong uboot_size = (uintptr_t)&__bss_end - 255e98947fSSimon Glass (uintptr_t)&__text_start; 265e98947fSSimon Glass ulong total_size; 27a1d57b7aSGraeme Russ ulong dest_addr; 28f697d528SSimon Glass ulong fdt_size = 0; 29a1d57b7aSGraeme Russ 30f697d528SSimon Glass #if defined(CONFIG_OF_SEPARATE) && defined(CONFIG_OF_CONTROL) 31f697d528SSimon Glass if (gd->fdt_blob) 32f697d528SSimon Glass fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, 32); 33f697d528SSimon Glass #endif 345e98947fSSimon Glass total_size = ALIGN(uboot_size, 1 << 12) + CONFIG_SYS_MALLOC_LEN + 35f697d528SSimon Glass CONFIG_SYS_STACK_SIZE + fdt_size; 365e98947fSSimon Glass 37f697d528SSimon Glass dest_addr = board_get_usable_ram_top(total_size); 38a1d57b7aSGraeme Russ /* 39a1d57b7aSGraeme Russ * NOTE: All destination address are rounded down to 16-byte 40a1d57b7aSGraeme Russ * boundary to satisfy various worst-case alignment 41a1d57b7aSGraeme Russ * requirements 42a1d57b7aSGraeme Russ */ 43f697d528SSimon Glass dest_addr &= ~15; 44a1d57b7aSGraeme Russ 45f697d528SSimon Glass #if defined(CONFIG_OF_SEPARATE) && defined(CONFIG_OF_CONTROL) 46f697d528SSimon Glass /* 47f697d528SSimon Glass * If the device tree is sitting immediate above our image then we 48f697d528SSimon Glass * must relocate it. If it is embedded in the data section, then it 49f697d528SSimon Glass * will be relocated with other data. 50f697d528SSimon Glass */ 51f697d528SSimon Glass if (gd->fdt_blob) { 52f697d528SSimon Glass dest_addr -= fdt_size; 531938f4a5SSimon Glass gd->new_fdt = (void *)dest_addr; 54f697d528SSimon Glass dest_addr &= ~15; 55f697d528SSimon Glass } 56f697d528SSimon Glass #endif 575e98947fSSimon Glass /* U-Boot is below the FDT */ 585e98947fSSimon Glass dest_addr -= uboot_size; 595e98947fSSimon Glass dest_addr &= ~((1 << 12) - 1); 60a1d57b7aSGraeme Russ gd->relocaddr = dest_addr; 615e98947fSSimon Glass gd->reloc_off = dest_addr - (uintptr_t)&__text_start; 62a1d57b7aSGraeme Russ 6332f98735SGabe Black /* Stack is at the bottom, so it can grow down */ 6432f98735SGabe Black gd->start_addr_sp = dest_addr - CONFIG_SYS_MALLOC_LEN; 6532f98735SGabe Black 66a1d57b7aSGraeme Russ return 0; 67a1d57b7aSGraeme Russ } 68a1d57b7aSGraeme Russ 69a1d57b7aSGraeme Russ int init_cache_f_r(void) 70a1d57b7aSGraeme Russ { 71db55bd7dSSimon Glass #if defined(CONFIG_X86_RESET_VECTOR) & !defined(CONFIG_HAVE_FSP) 72db55bd7dSSimon Glass int ret; 73db55bd7dSSimon Glass 74db55bd7dSSimon Glass ret = mtrr_commit(false); 75*3b621ccaSBin Meng /* If MTRR MSR is not implemented by the processor, just ignore it */ 76*3b621ccaSBin Meng if (ret && ret != -ENOSYS) 77db55bd7dSSimon Glass return ret; 78db55bd7dSSimon Glass #endif 79a1d57b7aSGraeme Russ /* Initialise the CPU cache(s) */ 80a1d57b7aSGraeme Russ return init_cache(); 81a1d57b7aSGraeme Russ } 82a1d57b7aSGraeme Russ 83d47ab0ecSGraeme Russ bd_t bd_data; 84d47ab0ecSGraeme Russ 85d47ab0ecSGraeme Russ int init_bd_struct_r(void) 86d47ab0ecSGraeme Russ { 87d47ab0ecSGraeme Russ gd->bd = &bd_data; 88d47ab0ecSGraeme Russ memset(gd->bd, 0, sizeof(bd_t)); 89d47ab0ecSGraeme Russ 90d47ab0ecSGraeme Russ return 0; 91d47ab0ecSGraeme Russ } 92d47ab0ecSGraeme Russ 938313315bSGabe Black int init_func_spi(void) 948313315bSGabe Black { 958313315bSGabe Black puts("SPI: "); 968313315bSGabe Black spi_init(); 978313315bSGabe Black puts("ready\n"); 988313315bSGabe Black return 0; 998313315bSGabe Black } 100