]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - lib_nios/board.c
OMAP3 MMC: Fix warning dereferencing type-punned pointer
[karo-tx-uboot.git] / lib_nios / board.c
index 693651bd5bfa7eb5165f2f953d8c02667856745d..72713a8fec7aebd8db2e15a300efee93343dc6b3 100644 (file)
  */
 
 #include <common.h>
-#include <devices.h>
+#include <stdio_dev.h>
 #include <watchdog.h>
+#include <malloc.h>
 #include <net.h>
 #ifdef CONFIG_STATUS_LED
 #include <status_led.h>
 #endif
 
+DECLARE_GLOBAL_DATA_PTR;
 
 /*
  * All attempts to come up with a "common" initialization sequence
 
 extern void malloc_bin_reloc (void);
 typedef int (init_fnc_t) (void);
-extern unsigned _vectors[];
-
-/*
- * Begin and End of memory area for malloc(), and current "brk"
- */
-static ulong   mem_malloc_start = 0;
-static ulong   mem_malloc_end   = 0;
-static ulong   mem_malloc_brk   = 0;
-
-/*
- * The Malloc area is immediately below the monitor copy in RAM
- */
-static void mem_malloc_init (void)
-{
-       mem_malloc_start = CFG_MALLOC_BASE;
-       mem_malloc_end = mem_malloc_start + CFG_MALLOC_LEN;
-       mem_malloc_brk = mem_malloc_start;
-       memset ((void *) mem_malloc_start,
-               0,
-               mem_malloc_end - mem_malloc_start);
-}
-
-void *sbrk (ptrdiff_t increment)
-{
-       ulong old = mem_malloc_brk;
-       ulong new = old + increment;
-
-       if ((new < mem_malloc_start) || (new > mem_malloc_end)) {
-               return (NULL);
-       }
-       mem_malloc_brk = new;
-       return ((void *) old);
-}
 
 
 /************************************************************************
@@ -90,8 +59,8 @@ void *sbrk (ptrdiff_t increment)
 
 init_fnc_t *init_sequence[] = {
 
-#if defined(CONFIG_BOARD_PRE_INIT)
-       board_pre_init,         /* Call board-specific init code early.*/
+#if defined(CONFIG_BOARD_EARLY_INIT_F)
+       board_early_init_f,     /* Call board-specific init code early.*/
 #endif
 
        env_init,
@@ -107,60 +76,63 @@ init_fnc_t *init_sequence[] = {
 /***********************************************************************/
 void board_init (void)
 {
-       DECLARE_GLOBAL_DATA_PTR;
-
        bd_t *bd;
        init_fnc_t **init_fnc_ptr;
        char *s, *e;
        int i;
 
        /* Pointer is writable since we allocated a register for it.
-        * Nios treats CFG_GBL_DATA_OFFSET as an address.
+        * Nios treats CONFIG_SYS_GBL_DATA_OFFSET as an address.
         */
-       gd = (gd_t *)CFG_GBL_DATA_OFFSET;
-       memset( gd, 0, CFG_GBL_DATA_SIZE );
+       gd = (gd_t *)CONFIG_SYS_GBL_DATA_OFFSET;
+       /* compiler optimization barrier needed for GCC >= 3.4 */
+       __asm__ __volatile__("": : :"memory");
 
-       /* Copy exception vectors to the correct location.
-        */
-       memcpy( (void *)CFG_VECT_BASE, _vectors, 256 );
+       memset( gd, 0, CONFIG_SYS_GBL_DATA_SIZE );
 
        gd->bd = (bd_t *)(gd+1);        /* At end of global data */
        gd->baudrate = CONFIG_BAUDRATE;
        gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
 
        bd = gd->bd;
-       bd->bi_memstart = CFG_SDRAM_BASE;
-       bd->bi_memsize = CFG_SDRAM_SIZE;
-       bd->bi_flashstart = CFG_FLASH_BASE;
-       bd->bi_sramstart= CFG_SRAM_BASE;
-       bd->bi_sramsize = CFG_SRAM_SIZE;
+       bd->bi_memstart = CONFIG_SYS_SDRAM_BASE;
+       bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE;
+       bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
+#if    defined(CONFIG_SYS_SRAM_BASE) && defined(CONFIG_SYS_SRAM_SIZE)
+       bd->bi_sramstart= CONFIG_SYS_SRAM_BASE;
+       bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE;
+#endif
        bd->bi_baudrate = CONFIG_BAUDRATE;
 
        for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
+               WATCHDOG_RESET ();
                if ((*init_fnc_ptr) () != 0) {
                        hang ();
                }
        }
 
-       bd->bi_flashsize = flash_init();
+       WATCHDOG_RESET ();
 
-       mem_malloc_init();
+       /* The Malloc area is immediately below the monitor copy in RAM */
+       mem_malloc_init(CONFIG_SYS_MALLOC_BASE, CONFIG_SYS_MALLOC_LEN);
        malloc_bin_reloc();
+
+       WATCHDOG_RESET ();
+       bd->bi_flashsize = flash_init();
+
+       WATCHDOG_RESET ();
        env_relocate();
 
        bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
-       s = getenv ("ethaddr");
-       for (i = 0; i < 6; ++i) {
-               bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;
-               if (s) s = (*e) ? e + 1 : e;
-       }
 
-       devices_init();
+       WATCHDOG_RESET ();
+       stdio_init();
        jumptable_init();
        console_init_r();
        /*
         */
 
+       WATCHDOG_RESET ();
        interrupt_init ();
 
 #ifdef CONFIG_STATUS_LED
@@ -186,3 +158,13 @@ void hang (void)
        puts("### ERROR ### Please reset board ###\n");
        for (;;);
 }
+
+unsigned long do_go_exec (ulong (*entry)(int, char *[]), int argc, char *argv[])
+{
+       /*
+        * x86 does not use a dedicated register to pass the pointer
+        * to the global_data
+        */
+       argv[-1] = (char *)gd;
+       return entry (argc, argv);
+}