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*db55bd7dSSimon Glass #include <asm/mtrr.h> 1186cfb6bdSSimon Glass #include <asm/sections.h> 12d47ab0ecSGraeme Russ 13d47ab0ecSGraeme Russ DECLARE_GLOBAL_DATA_PTR; 14d47ab0ecSGraeme Russ 155e98947fSSimon Glass /* Get the top of usable RAM */ 165e98947fSSimon Glass __weak ulong board_get_usable_ram_top(ulong total_size) 17a1d57b7aSGraeme Russ { 185e98947fSSimon Glass return gd->ram_size; 195e98947fSSimon Glass } 205e98947fSSimon Glass 215e98947fSSimon Glass int calculate_relocation_address(void) 225e98947fSSimon Glass { 235e98947fSSimon Glass const ulong uboot_size = (uintptr_t)&__bss_end - 245e98947fSSimon Glass (uintptr_t)&__text_start; 255e98947fSSimon Glass ulong total_size; 26a1d57b7aSGraeme Russ ulong dest_addr; 27f697d528SSimon Glass ulong fdt_size = 0; 28a1d57b7aSGraeme Russ 29f697d528SSimon Glass #if defined(CONFIG_OF_SEPARATE) && defined(CONFIG_OF_CONTROL) 30f697d528SSimon Glass if (gd->fdt_blob) 31f697d528SSimon Glass fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, 32); 32f697d528SSimon Glass #endif 335e98947fSSimon Glass total_size = ALIGN(uboot_size, 1 << 12) + CONFIG_SYS_MALLOC_LEN + 34f697d528SSimon Glass CONFIG_SYS_STACK_SIZE + fdt_size; 355e98947fSSimon Glass 36f697d528SSimon Glass dest_addr = board_get_usable_ram_top(total_size); 37a1d57b7aSGraeme Russ /* 38a1d57b7aSGraeme Russ * NOTE: All destination address are rounded down to 16-byte 39a1d57b7aSGraeme Russ * boundary to satisfy various worst-case alignment 40a1d57b7aSGraeme Russ * requirements 41a1d57b7aSGraeme Russ */ 42f697d528SSimon Glass dest_addr &= ~15; 43a1d57b7aSGraeme Russ 44f697d528SSimon Glass #if defined(CONFIG_OF_SEPARATE) && defined(CONFIG_OF_CONTROL) 45f697d528SSimon Glass /* 46f697d528SSimon Glass * If the device tree is sitting immediate above our image then we 47f697d528SSimon Glass * must relocate it. If it is embedded in the data section, then it 48f697d528SSimon Glass * will be relocated with other data. 49f697d528SSimon Glass */ 50f697d528SSimon Glass if (gd->fdt_blob) { 51f697d528SSimon Glass dest_addr -= fdt_size; 521938f4a5SSimon Glass gd->new_fdt = (void *)dest_addr; 53f697d528SSimon Glass dest_addr &= ~15; 54f697d528SSimon Glass } 55f697d528SSimon Glass #endif 565e98947fSSimon Glass /* U-Boot is below the FDT */ 575e98947fSSimon Glass dest_addr -= uboot_size; 585e98947fSSimon Glass dest_addr &= ~((1 << 12) - 1); 59a1d57b7aSGraeme Russ gd->relocaddr = dest_addr; 605e98947fSSimon Glass gd->reloc_off = dest_addr - (uintptr_t)&__text_start; 61a1d57b7aSGraeme Russ 6232f98735SGabe Black /* Stack is at the bottom, so it can grow down */ 6332f98735SGabe Black gd->start_addr_sp = dest_addr - CONFIG_SYS_MALLOC_LEN; 6432f98735SGabe Black 65a1d57b7aSGraeme Russ return 0; 66a1d57b7aSGraeme Russ } 67a1d57b7aSGraeme Russ 68a1d57b7aSGraeme Russ int init_cache_f_r(void) 69a1d57b7aSGraeme Russ { 70*db55bd7dSSimon Glass #if defined(CONFIG_X86_RESET_VECTOR) & !defined(CONFIG_HAVE_FSP) 71*db55bd7dSSimon Glass int ret; 72*db55bd7dSSimon Glass 73*db55bd7dSSimon Glass ret = mtrr_commit(false); 74*db55bd7dSSimon Glass if (ret) 75*db55bd7dSSimon Glass return ret; 76*db55bd7dSSimon Glass #endif 77a1d57b7aSGraeme Russ /* Initialise the CPU cache(s) */ 78a1d57b7aSGraeme Russ return init_cache(); 79a1d57b7aSGraeme Russ } 80a1d57b7aSGraeme Russ 81d47ab0ecSGraeme Russ bd_t bd_data; 82d47ab0ecSGraeme Russ 83d47ab0ecSGraeme Russ int init_bd_struct_r(void) 84d47ab0ecSGraeme Russ { 85d47ab0ecSGraeme Russ gd->bd = &bd_data; 86d47ab0ecSGraeme Russ memset(gd->bd, 0, sizeof(bd_t)); 87d47ab0ecSGraeme Russ 88d47ab0ecSGraeme Russ return 0; 89d47ab0ecSGraeme Russ } 90d47ab0ecSGraeme Russ 918313315bSGabe Black int init_func_spi(void) 928313315bSGabe Black { 938313315bSGabe Black puts("SPI: "); 948313315bSGabe Black spi_init(); 958313315bSGabe Black puts("ready\n"); 968313315bSGabe Black return 0; 978313315bSGabe Black } 98