1d47ab0ecSGraeme Russ /* 2d47ab0ecSGraeme Russ * (C) Copyright 2011 3d47ab0ecSGraeme Russ * Graeme Russ, <graeme.russ@gmail.com> 4d47ab0ecSGraeme Russ * 5d47ab0ecSGraeme Russ * See file CREDITS for list of people who contributed to this 6d47ab0ecSGraeme Russ * project. 7d47ab0ecSGraeme Russ * 8d47ab0ecSGraeme Russ * This program is free software; you can redistribute it and/or 9d47ab0ecSGraeme Russ * modify it under the terms of the GNU General Public License as 10d47ab0ecSGraeme Russ * published by the Free Software Foundation; either version 2 of 11d47ab0ecSGraeme Russ * the License, or (at your option) any later version. 12d47ab0ecSGraeme Russ * 13d47ab0ecSGraeme Russ * This program is distributed in the hope that it will be useful, 14d47ab0ecSGraeme Russ * but WITHOUT ANY WARRANTY; without even the implied warranty of 15d47ab0ecSGraeme Russ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16d47ab0ecSGraeme Russ * GNU General Public License for more details. 17d47ab0ecSGraeme Russ * 18d47ab0ecSGraeme Russ * You should have received a copy of the GNU General Public License 19d47ab0ecSGraeme Russ * along with this program; if not, write to the Free Software 20d47ab0ecSGraeme Russ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21d47ab0ecSGraeme Russ * MA 02111-1307 USA 22d47ab0ecSGraeme Russ */ 23d47ab0ecSGraeme Russ #include <common.h> 24d47ab0ecSGraeme Russ #include <command.h> 25d47ab0ecSGraeme Russ #include <stdio_dev.h> 26d47ab0ecSGraeme Russ #include <version.h> 27d47ab0ecSGraeme Russ #include <malloc.h> 28d47ab0ecSGraeme Russ #include <net.h> 29d47ab0ecSGraeme Russ #include <ide.h> 30d47ab0ecSGraeme Russ #include <serial.h> 318313315bSGabe Black #include <spi.h> 32d47ab0ecSGraeme Russ #include <status_led.h> 33a1d57b7aSGraeme Russ #include <asm/processor.h> 34d47ab0ecSGraeme Russ #include <asm/u-boot-x86.h> 35*d65297b6SGabe Black #include <linux/compiler.h> 36d47ab0ecSGraeme Russ 37d47ab0ecSGraeme Russ #include <asm/init_helpers.h> 38d47ab0ecSGraeme Russ 39d47ab0ecSGraeme Russ DECLARE_GLOBAL_DATA_PTR; 40d47ab0ecSGraeme Russ 41d47ab0ecSGraeme Russ /************************************************************************ 42d47ab0ecSGraeme Russ * Init Utilities * 43d47ab0ecSGraeme Russ ************************************************************************ 44d47ab0ecSGraeme Russ * Some of this code should be moved into the core functions, 45d47ab0ecSGraeme Russ * or dropped completely, 46d47ab0ecSGraeme Russ * but let's get it working (again) first... 47d47ab0ecSGraeme Russ */ 48d47ab0ecSGraeme Russ 49d47ab0ecSGraeme Russ int display_banner(void) 50d47ab0ecSGraeme Russ { 51d47ab0ecSGraeme Russ printf("\n\n%s\n\n", version_string); 52d47ab0ecSGraeme Russ 53d47ab0ecSGraeme Russ return 0; 54d47ab0ecSGraeme Russ } 55d47ab0ecSGraeme Russ 56d47ab0ecSGraeme Russ int display_dram_config(void) 57d47ab0ecSGraeme Russ { 58d47ab0ecSGraeme Russ int i; 59d47ab0ecSGraeme Russ 60d47ab0ecSGraeme Russ puts("DRAM Configuration:\n"); 61d47ab0ecSGraeme Russ 62d47ab0ecSGraeme Russ for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { 63d47ab0ecSGraeme Russ printf("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start); 64d47ab0ecSGraeme Russ print_size(gd->bd->bi_dram[i].size, "\n"); 65d47ab0ecSGraeme Russ } 66d47ab0ecSGraeme Russ 67d47ab0ecSGraeme Russ return 0; 68d47ab0ecSGraeme Russ } 69d47ab0ecSGraeme Russ 70d47ab0ecSGraeme Russ int init_baudrate_f(void) 71d47ab0ecSGraeme Russ { 72d47ab0ecSGraeme Russ gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE); 73d47ab0ecSGraeme Russ return 0; 74d47ab0ecSGraeme Russ } 75d47ab0ecSGraeme Russ 76*d65297b6SGabe Black __weak int calculate_relocation_address(void) 77a1d57b7aSGraeme Russ { 78a1d57b7aSGraeme Russ ulong text_start = (ulong)&__text_start; 79a1d57b7aSGraeme Russ ulong bss_end = (ulong)&__bss_end; 80a1d57b7aSGraeme Russ ulong dest_addr; 81a1d57b7aSGraeme Russ 82a1d57b7aSGraeme Russ /* 83a1d57b7aSGraeme Russ * NOTE: All destination address are rounded down to 16-byte 84a1d57b7aSGraeme Russ * boundary to satisfy various worst-case alignment 85a1d57b7aSGraeme Russ * requirements 86a1d57b7aSGraeme Russ */ 87a1d57b7aSGraeme Russ 888d61625dSGraeme Russ /* Stack is at top of available memory */ 89a1d57b7aSGraeme Russ dest_addr = gd->ram_size; 90a1d57b7aSGraeme Russ 9132f98735SGabe Black /* U-Boot is at the top */ 92a1d57b7aSGraeme Russ dest_addr -= (bss_end - text_start); 93a1d57b7aSGraeme Russ dest_addr &= ~15; 94a1d57b7aSGraeme Russ gd->relocaddr = dest_addr; 95a1d57b7aSGraeme Russ gd->reloc_off = (dest_addr - text_start); 96a1d57b7aSGraeme Russ 9732f98735SGabe Black /* Stack is at the bottom, so it can grow down */ 9832f98735SGabe Black gd->start_addr_sp = dest_addr - CONFIG_SYS_MALLOC_LEN; 9932f98735SGabe Black 100a1d57b7aSGraeme Russ return 0; 101a1d57b7aSGraeme Russ } 102a1d57b7aSGraeme Russ 103a1d57b7aSGraeme Russ int init_cache_f_r(void) 104a1d57b7aSGraeme Russ { 105a1d57b7aSGraeme Russ /* Initialise the CPU cache(s) */ 106a1d57b7aSGraeme Russ return init_cache(); 107a1d57b7aSGraeme Russ } 108a1d57b7aSGraeme Russ 109a1d57b7aSGraeme Russ int set_reloc_flag_r(void) 110a1d57b7aSGraeme Russ { 111a1d57b7aSGraeme Russ gd->flags = GD_FLG_RELOC; 112a1d57b7aSGraeme Russ 113a1d57b7aSGraeme Russ return 0; 114a1d57b7aSGraeme Russ } 115a1d57b7aSGraeme Russ 116d47ab0ecSGraeme Russ int mem_malloc_init_r(void) 117d47ab0ecSGraeme Russ { 118d47ab0ecSGraeme Russ mem_malloc_init(((gd->relocaddr - CONFIG_SYS_MALLOC_LEN)+3)&~3, 119d47ab0ecSGraeme Russ CONFIG_SYS_MALLOC_LEN); 120d47ab0ecSGraeme Russ 121d47ab0ecSGraeme Russ return 0; 122d47ab0ecSGraeme Russ } 123d47ab0ecSGraeme Russ 124d47ab0ecSGraeme Russ bd_t bd_data; 125d47ab0ecSGraeme Russ 126d47ab0ecSGraeme Russ int init_bd_struct_r(void) 127d47ab0ecSGraeme Russ { 128d47ab0ecSGraeme Russ gd->bd = &bd_data; 129d47ab0ecSGraeme Russ memset(gd->bd, 0, sizeof(bd_t)); 130d47ab0ecSGraeme Russ 131d47ab0ecSGraeme Russ return 0; 132d47ab0ecSGraeme Russ } 133d47ab0ecSGraeme Russ 134d47ab0ecSGraeme Russ #ifndef CONFIG_SYS_NO_FLASH 135d47ab0ecSGraeme Russ int flash_init_r(void) 136d47ab0ecSGraeme Russ { 137d47ab0ecSGraeme Russ ulong size; 138d47ab0ecSGraeme Russ 139d47ab0ecSGraeme Russ puts("Flash: "); 140d47ab0ecSGraeme Russ 141d47ab0ecSGraeme Russ /* configure available FLASH banks */ 142d47ab0ecSGraeme Russ size = flash_init(); 143d47ab0ecSGraeme Russ 144d47ab0ecSGraeme Russ print_size(size, "\n"); 145d47ab0ecSGraeme Russ 146d47ab0ecSGraeme Russ return 0; 147d47ab0ecSGraeme Russ } 148d47ab0ecSGraeme Russ #endif 149d47ab0ecSGraeme Russ 150d47ab0ecSGraeme Russ #ifdef CONFIG_STATUS_LED 151d47ab0ecSGraeme Russ int status_led_set_r(void) 152d47ab0ecSGraeme Russ { 153d47ab0ecSGraeme Russ status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING); 154d47ab0ecSGraeme Russ 155d47ab0ecSGraeme Russ return 0; 156d47ab0ecSGraeme Russ } 157d47ab0ecSGraeme Russ #endif 158d47ab0ecSGraeme Russ 159d47ab0ecSGraeme Russ int set_load_addr_r(void) 160d47ab0ecSGraeme Russ { 161d47ab0ecSGraeme Russ /* Initialize from environment */ 162d47ab0ecSGraeme Russ load_addr = getenv_ulong("loadaddr", 16, load_addr); 163d47ab0ecSGraeme Russ 164d47ab0ecSGraeme Russ return 0; 165d47ab0ecSGraeme Russ } 1668313315bSGabe Black 1678313315bSGabe Black int init_func_spi(void) 1688313315bSGabe Black { 1698313315bSGabe Black puts("SPI: "); 1708313315bSGabe Black spi_init(); 1718313315bSGabe Black puts("ready\n"); 1728313315bSGabe Black return 0; 1738313315bSGabe Black } 174