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> 31*8313315bSGabe Black #include <spi.h> 32d47ab0ecSGraeme Russ #include <status_led.h> 33a1d57b7aSGraeme Russ #include <asm/processor.h> 34d47ab0ecSGraeme Russ #include <asm/u-boot-x86.h> 35d47ab0ecSGraeme Russ 36d47ab0ecSGraeme Russ #include <asm/init_helpers.h> 37d47ab0ecSGraeme Russ 38d47ab0ecSGraeme Russ DECLARE_GLOBAL_DATA_PTR; 39d47ab0ecSGraeme Russ 40d47ab0ecSGraeme Russ /************************************************************************ 41d47ab0ecSGraeme Russ * Init Utilities * 42d47ab0ecSGraeme Russ ************************************************************************ 43d47ab0ecSGraeme Russ * Some of this code should be moved into the core functions, 44d47ab0ecSGraeme Russ * or dropped completely, 45d47ab0ecSGraeme Russ * but let's get it working (again) first... 46d47ab0ecSGraeme Russ */ 47d47ab0ecSGraeme Russ 48d47ab0ecSGraeme Russ int display_banner(void) 49d47ab0ecSGraeme Russ { 50d47ab0ecSGraeme Russ printf("\n\n%s\n\n", version_string); 51d47ab0ecSGraeme Russ 52d47ab0ecSGraeme Russ return 0; 53d47ab0ecSGraeme Russ } 54d47ab0ecSGraeme Russ 55d47ab0ecSGraeme Russ int display_dram_config(void) 56d47ab0ecSGraeme Russ { 57d47ab0ecSGraeme Russ int i; 58d47ab0ecSGraeme Russ 59d47ab0ecSGraeme Russ puts("DRAM Configuration:\n"); 60d47ab0ecSGraeme Russ 61d47ab0ecSGraeme Russ for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { 62d47ab0ecSGraeme Russ printf("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start); 63d47ab0ecSGraeme Russ print_size(gd->bd->bi_dram[i].size, "\n"); 64d47ab0ecSGraeme Russ } 65d47ab0ecSGraeme Russ 66d47ab0ecSGraeme Russ return 0; 67d47ab0ecSGraeme Russ } 68d47ab0ecSGraeme Russ 69d47ab0ecSGraeme Russ int init_baudrate_f(void) 70d47ab0ecSGraeme Russ { 71d47ab0ecSGraeme Russ gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE); 72d47ab0ecSGraeme Russ return 0; 73d47ab0ecSGraeme Russ } 74d47ab0ecSGraeme Russ 75a1d57b7aSGraeme Russ int calculate_relocation_address(void) 76a1d57b7aSGraeme Russ { 77a1d57b7aSGraeme Russ ulong text_start = (ulong)&__text_start; 78a1d57b7aSGraeme Russ ulong bss_end = (ulong)&__bss_end; 79a1d57b7aSGraeme Russ ulong dest_addr; 80a1d57b7aSGraeme Russ 81a1d57b7aSGraeme Russ /* 82a1d57b7aSGraeme Russ * NOTE: All destination address are rounded down to 16-byte 83a1d57b7aSGraeme Russ * boundary to satisfy various worst-case alignment 84a1d57b7aSGraeme Russ * requirements 85a1d57b7aSGraeme Russ */ 86a1d57b7aSGraeme Russ 878d61625dSGraeme Russ /* Stack is at top of available memory */ 88a1d57b7aSGraeme Russ dest_addr = gd->ram_size; 89a1d57b7aSGraeme Russ gd->start_addr_sp = dest_addr; 90a1d57b7aSGraeme Russ 91a1d57b7aSGraeme Russ /* U-Boot is below the stack */ 92a1d57b7aSGraeme Russ dest_addr -= CONFIG_SYS_STACK_SIZE; 93a1d57b7aSGraeme Russ dest_addr -= (bss_end - text_start); 94a1d57b7aSGraeme Russ dest_addr &= ~15; 95a1d57b7aSGraeme Russ gd->relocaddr = dest_addr; 96a1d57b7aSGraeme Russ gd->reloc_off = (dest_addr - text_start); 97a1d57b7aSGraeme Russ 98a1d57b7aSGraeme Russ return 0; 99a1d57b7aSGraeme Russ } 100a1d57b7aSGraeme Russ 101a1d57b7aSGraeme Russ int init_cache_f_r(void) 102a1d57b7aSGraeme Russ { 103a1d57b7aSGraeme Russ /* Initialise the CPU cache(s) */ 104a1d57b7aSGraeme Russ return init_cache(); 105a1d57b7aSGraeme Russ } 106a1d57b7aSGraeme Russ 107a1d57b7aSGraeme Russ int set_reloc_flag_r(void) 108a1d57b7aSGraeme Russ { 109a1d57b7aSGraeme Russ gd->flags = GD_FLG_RELOC; 110a1d57b7aSGraeme Russ 111a1d57b7aSGraeme Russ return 0; 112a1d57b7aSGraeme Russ } 113a1d57b7aSGraeme Russ 114d47ab0ecSGraeme Russ int mem_malloc_init_r(void) 115d47ab0ecSGraeme Russ { 116d47ab0ecSGraeme Russ mem_malloc_init(((gd->relocaddr - CONFIG_SYS_MALLOC_LEN)+3)&~3, 117d47ab0ecSGraeme Russ CONFIG_SYS_MALLOC_LEN); 118d47ab0ecSGraeme Russ 119d47ab0ecSGraeme Russ return 0; 120d47ab0ecSGraeme Russ } 121d47ab0ecSGraeme Russ 122d47ab0ecSGraeme Russ bd_t bd_data; 123d47ab0ecSGraeme Russ 124d47ab0ecSGraeme Russ int init_bd_struct_r(void) 125d47ab0ecSGraeme Russ { 126d47ab0ecSGraeme Russ gd->bd = &bd_data; 127d47ab0ecSGraeme Russ memset(gd->bd, 0, sizeof(bd_t)); 128d47ab0ecSGraeme Russ 129d47ab0ecSGraeme Russ return 0; 130d47ab0ecSGraeme Russ } 131d47ab0ecSGraeme Russ 132d47ab0ecSGraeme Russ #ifndef CONFIG_SYS_NO_FLASH 133d47ab0ecSGraeme Russ int flash_init_r(void) 134d47ab0ecSGraeme Russ { 135d47ab0ecSGraeme Russ ulong size; 136d47ab0ecSGraeme Russ 137d47ab0ecSGraeme Russ puts("Flash: "); 138d47ab0ecSGraeme Russ 139d47ab0ecSGraeme Russ /* configure available FLASH banks */ 140d47ab0ecSGraeme Russ size = flash_init(); 141d47ab0ecSGraeme Russ 142d47ab0ecSGraeme Russ print_size(size, "\n"); 143d47ab0ecSGraeme Russ 144d47ab0ecSGraeme Russ return 0; 145d47ab0ecSGraeme Russ } 146d47ab0ecSGraeme Russ #endif 147d47ab0ecSGraeme Russ 148d47ab0ecSGraeme Russ #ifdef CONFIG_STATUS_LED 149d47ab0ecSGraeme Russ int status_led_set_r(void) 150d47ab0ecSGraeme Russ { 151d47ab0ecSGraeme Russ status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING); 152d47ab0ecSGraeme Russ 153d47ab0ecSGraeme Russ return 0; 154d47ab0ecSGraeme Russ } 155d47ab0ecSGraeme Russ #endif 156d47ab0ecSGraeme Russ 157d47ab0ecSGraeme Russ int set_load_addr_r(void) 158d47ab0ecSGraeme Russ { 159d47ab0ecSGraeme Russ /* Initialize from environment */ 160d47ab0ecSGraeme Russ load_addr = getenv_ulong("loadaddr", 16, load_addr); 161d47ab0ecSGraeme Russ 162d47ab0ecSGraeme Russ return 0; 163d47ab0ecSGraeme Russ } 164*8313315bSGabe Black 165*8313315bSGabe Black int init_func_spi(void) 166*8313315bSGabe Black { 167*8313315bSGabe Black puts("SPI: "); 168*8313315bSGabe Black spi_init(); 169*8313315bSGabe Black puts("ready\n"); 170*8313315bSGabe Black return 0; 171*8313315bSGabe Black } 172