2 * (C) Copyright 2007 Michal Simek
3 * (C) Copyright 2004 Atmark Techno, Inc.
5 * Michal SIMEK <monstr@monstr.eu>
6 * Yasushi SHOJI <yashi@atmark-techno.com>
8 * See file CREDITS for list of people who contributed to this
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License as
13 * published by the Free Software Foundation; either version 2 of
14 * the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
32 #include <stdio_dev.h>
35 #include <linux/compiler.h>
36 #include <asm/processor.h>
37 #include <asm/microblaze_intc.h>
40 DECLARE_GLOBAL_DATA_PTR
;
43 * All attempts to come up with a "common" initialization sequence
44 * that works for all boards and architectures failed: some of the
45 * requirements are just _too_ different. To get rid of the resulting
46 * mess of board dependend #ifdef'ed code we now make the whole
47 * initialization sequence configurable to the user.
49 * The requirements for any new initalization function is simple: it
50 * receives a pointer to the "global data" structure as it's only
51 * argument, and returns an integer return code, where 0 means
52 * "continue" and != 0 means "fatal error, hang the system".
54 typedef int (init_fnc_t
) (void);
56 init_fnc_t
*init_sequence
[] = {
58 #ifdef CONFIG_OF_CONTROL
68 unsigned long monitor_flash_len
;
70 void board_init_f(ulong not_used
)
73 init_fnc_t
**init_fnc_ptr
;
74 gd
= (gd_t
*) (CONFIG_SYS_SDRAM_BASE
+ CONFIG_SYS_GBL_DATA_OFFSET
);
75 bd
= (bd_t
*) (CONFIG_SYS_SDRAM_BASE
+ CONFIG_SYS_GBL_DATA_OFFSET \
76 - GENERATED_BD_INFO_SIZE
);
77 #if defined(CONFIG_CMD_FLASH)
80 asm ("nop"); /* FIXME gd is not initialize - wait */
81 memset ((void *)gd
, 0, GENERATED_GBL_DATA_SIZE
);
82 memset ((void *)bd
, 0, GENERATED_BD_INFO_SIZE
);
84 gd
->baudrate
= CONFIG_BAUDRATE
;
85 bd
->bi_baudrate
= CONFIG_BAUDRATE
;
86 bd
->bi_memstart
= CONFIG_SYS_SDRAM_BASE
;
87 bd
->bi_memsize
= CONFIG_SYS_SDRAM_SIZE
;
88 gd
->flags
|= GD_FLG_RELOC
; /* tell others: relocation done */
90 monitor_flash_len
= __end
- __text_start
;
92 #ifdef CONFIG_OF_EMBED
93 /* Get a pointer to the FDT */
94 gd
->fdt_blob
= _binary_dt_dtb_start
;
95 #elif defined CONFIG_OF_SEPARATE
96 /* FDT is at end of image */
97 gd
->fdt_blob
= (void *)__end
;
99 /* Allow the early environment to override the fdt address */
100 gd
->fdt_blob
= (void *)getenv_ulong("fdtcontroladdr", 16,
101 (uintptr_t)gd
->fdt_blob
);
104 * The Malloc area is immediately below the monitor copy in DRAM
105 * aka CONFIG_SYS_MONITOR_BASE - Note there is no need for reloc_off
106 * as our monitory code is run from SDRAM
108 mem_malloc_init (CONFIG_SYS_MALLOC_BASE
, CONFIG_SYS_MALLOC_LEN
);
112 for (init_fnc_ptr
= init_sequence
; *init_fnc_ptr
; ++init_fnc_ptr
) {
114 if ((*init_fnc_ptr
) () != 0) {
119 #ifdef CONFIG_OF_CONTROL
120 /* For now, put this check after the console is ready */
121 if (fdtdec_prepare_fdt()) {
122 panic("** CONFIG_OF_CONTROL defined but no FDT - please see "
123 "doc/README.fdt-control");
125 printf("DTB: 0x%x\n", (u32
)gd
->fdt_blob
);
129 printf ("\t\tIcache:%s\n", icache_status() ? "ON" : "OFF");
130 printf ("\t\tDcache:%s\n", dcache_status() ? "ON" : "OFF");
131 printf ("\tU-Boot Start:0x%08x\n", CONFIG_SYS_TEXT_BASE
);
133 #if defined(CONFIG_CMD_FLASH)
135 bd
->bi_flashstart
= CONFIG_SYS_FLASH_BASE
;
136 flash_size
= flash_init();
137 if (bd
->bi_flashstart
&& flash_size
> 0) {
138 # ifdef CONFIG_SYS_FLASH_CHECKSUM
139 print_size (flash_size
, "");
141 * Compute and print flash CRC if flashchecksum is set to 'y'
143 * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
145 if (getenv_yesno("flashchecksum") == 1) {
146 printf (" CRC: %08X",
147 crc32(0, (const u8
*)bd
->bi_flashstart
,
152 # else /* !CONFIG_SYS_FLASH_CHECKSUM */
153 print_size (flash_size
, "\n");
154 # endif /* CONFIG_SYS_FLASH_CHECKSUM */
155 bd
->bi_flashsize
= flash_size
;
156 bd
->bi_flashoffset
= bd
->bi_flashstart
+ flash_size
;
158 puts ("Flash init FAILED");
159 bd
->bi_flashstart
= 0;
160 bd
->bi_flashsize
= 0;
161 bd
->bi_flashoffset
= 0;
165 /* relocate environment function pointers etc. */
168 /* Initialize stdio devices */
171 /* Initialize the jump table for applications */
174 /* Initialize the console (after the relocation and devices init) */
179 /* Initialize from environment */
180 load_addr
= getenv_ulong("loadaddr", 16, load_addr
);
182 #if defined(CONFIG_CMD_NET)
184 eth_initialize(gd
->bd
);
187 eth_getenv_enetaddr("ethaddr", enetaddr
);
188 printf("MAC: %pM\n", enetaddr
);
200 puts ("### ERROR ### Please RESET the board ###\n");