2 * Copyright (C) 2004-2006 Atmel Corporation
4 * SPDX-License-Identifier: GPL-2.0+
12 #include <atmel_mci.h>
14 #ifdef CONFIG_BITBANGMII
18 #include <asm/sections.h>
19 #include <asm/arch/mmu.h>
20 #include <asm/arch/hardware.h>
22 #ifndef CONFIG_IDENT_STRING
23 #define CONFIG_IDENT_STRING ""
26 #ifdef CONFIG_GENERIC_ATMEL_MCI
29 DECLARE_GLOBAL_DATA_PTR
;
31 unsigned long monitor_flash_len
;
33 /* Weak aliases for optional board functions */
34 static int __do_nothing(void)
38 int board_postclk_init(void) __attribute__((weak
, alias("__do_nothing")));
39 int board_early_init_r(void) __attribute__((weak
, alias("__do_nothing")));
41 /* provide cpu_mmc_init, to overwrite provide board_mmc_init */
42 int cpu_mmc_init(bd_t
*bd
)
44 /* This calls the atmel_mci_init in gen_atmel_mci.c */
45 return atmel_mci_init((void *)ATMEL_BASE_MMCI
);
48 static int init_baudrate(void)
50 gd
->baudrate
= getenv_ulong("baudrate", 10, CONFIG_BAUDRATE
);
54 static int display_banner (void)
56 printf ("\n\n%s\n\n", version_string
);
57 printf ("U-Boot code: %08lx -> %08lx data: %08lx -> %08lx\n",
58 (unsigned long)_text
, (unsigned long)_etext
,
59 (unsigned long)_data
, (unsigned long)(&__bss_end
));
63 static int display_dram_config (void)
67 puts ("DRAM Configuration:\n");
69 for (i
= 0; i
< CONFIG_NR_DRAM_BANKS
; i
++) {
70 printf ("Bank #%d: %08lx ", i
, gd
->bd
->bi_dram
[i
].start
);
71 print_size (gd
->bd
->bi_dram
[i
].size
, "\n");
77 static void display_flash_config (void)
80 print_size(gd
->bd
->bi_flashsize
, " ");
81 printf("at address 0x%08lx\n", gd
->bd
->bi_flashstart
);
84 void board_init_f(ulong board_type
)
89 unsigned long *new_sp
;
90 unsigned long monitor_len
;
91 unsigned long monitor_addr
;
95 /* Initialize the global data pointer */
96 memset(&gd_data
, 0, sizeof(gd_data
));
99 /* Perform initialization sequence */
100 board_early_init_f();
102 board_postclk_init();
108 sdram_size
= initdram(board_type
);
110 /* If we have no SDRAM, we can't go on */
112 panic("No working SDRAM available\n");
115 * Now that we have DRAM mapped and working, we can
116 * relocate the code and continue running from DRAM.
118 * Reserve memory at end of RAM for (top down in that order):
120 * - heap for malloc()
121 * - board info struct
122 * - global data struct
125 addr
= CONFIG_SYS_SDRAM_BASE
+ sdram_size
;
126 monitor_len
= (char *)(&__bss_end
) - _text
;
129 * Reserve memory for u-boot code, data and bss.
130 * Round down to next 4 kB limit.
133 addr
&= ~(4096UL - 1);
136 /* Reserve memory for malloc() */
137 addr
-= CONFIG_SYS_MALLOC_LEN
;
140 #ifdef CONFIG_FB_ADDR
141 printf("LCD: Frame buffer allocated at preset 0x%08x\n",
143 gd
->fb_base
= CONFIG_FB_ADDR
;
145 addr
= lcd_setmem(addr
);
146 printf("LCD: Frame buffer allocated at 0x%08lx\n", addr
);
148 #endif /* CONFIG_FB_ADDR */
149 #endif /* CONFIG_LCD */
151 /* Allocate a Board Info struct on a word boundary */
152 addr
-= sizeof(bd_t
);
154 gd
->bd
= bd
= (bd_t
*)addr
;
156 /* Allocate a new global data copy on a 8-byte boundary. */
157 addr
-= sizeof(gd_t
);
159 new_gd
= (gd_t
*)addr
;
161 /* And finally, a new, bigger stack. */
162 new_sp
= (unsigned long *)addr
;
163 gd
->arch
.stack_end
= addr
;
168 * Initialize the board information struct with the
169 * information we have.
171 bd
->bi_dram
[0].start
= CONFIG_SYS_SDRAM_BASE
;
172 bd
->bi_dram
[0].size
= sdram_size
;
174 memcpy(new_gd
, gd
, sizeof(gd_t
));
176 relocate_code((unsigned long)new_sp
, new_gd
, monitor_addr
);
179 void board_init_r(gd_t
*new_gd
, ulong dest_addr
)
181 #ifndef CONFIG_ENV_IS_NOWHERE
182 extern char * env_name_spec
;
189 gd
->flags
|= GD_FLG_RELOC
;
190 gd
->reloc_off
= dest_addr
- CONFIG_SYS_MONITOR_BASE
;
192 /* Enable the MMU so that we can keep u-boot simple */
193 mmu_init_r(dest_addr
);
195 board_early_init_r();
197 monitor_flash_len
= _edata
- _text
;
199 #if defined(CONFIG_NEEDS_MANUAL_RELOC)
201 * We have to relocate the command table manually
203 fixup_cmdtable(ll_entry_start(cmd_tbl_t
, cmd
),
204 ll_entry_count(cmd_tbl_t
, cmd
));
205 #endif /* defined(CONFIG_NEEDS_MANUAL_RELOC) */
207 /* there are some other pointer constants we must deal with */
208 #ifndef CONFIG_ENV_IS_NOWHERE
209 env_name_spec
+= gd
->reloc_off
;
214 /* The malloc area is right below the monitor image in RAM */
215 mem_malloc_init(CONFIG_SYS_MONITOR_BASE
+ gd
->reloc_off
-
216 CONFIG_SYS_MALLOC_LEN
, CONFIG_SYS_MALLOC_LEN
);
220 bd
->bi_flashstart
= 0;
221 bd
->bi_flashsize
= 0;
222 bd
->bi_flashoffset
= 0;
224 #ifndef CONFIG_SYS_NO_FLASH
225 bd
->bi_flashstart
= CONFIG_SYS_FLASH_BASE
;
226 bd
->bi_flashsize
= flash_init();
227 bd
->bi_flashoffset
= (unsigned long)_edata
- (unsigned long)_text
;
229 if (bd
->bi_flashsize
)
230 display_flash_config();
233 if (bd
->bi_dram
[0].size
)
234 display_dram_config();
236 gd
->bd
->bi_boot_params
= malloc(CONFIG_SYS_BOOTPARAMS_LEN
);
237 if (!gd
->bd
->bi_boot_params
)
238 puts("WARNING: Cannot allocate space for boot parameters\n");
240 /* initialize environment */
247 /* Initialize from environment */
248 load_addr
= getenv_ulong("loadaddr", 16, load_addr
);
250 #ifdef CONFIG_BITBANGMII
253 #if defined(CONFIG_CMD_NET)
255 eth_initialize(gd
->bd
);
258 #ifdef CONFIG_GENERIC_ATMEL_MCI
259 mmc_initialize(gd
->bd
);