Skip to content
Snippets Groups Projects
board_f.c 24.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • 	gd->flags = boot_flags;
    
    	gd->have_console = 0;
    
    
    	if (initcall_run_list(init_sequence_f))
    		hang();
    
    
    #if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)
    
    	/* NOTREACHED - jump_to_copy() does not return */
    	hang();
    #endif
    }
    
    
    #ifdef CONFIG_X86
    /*
     * For now this code is only used on x86.
     *
     * init_sequence_f_r is the list of init functions which are run when
     * U-Boot is executing from Flash with a semi-limited 'C' environment.
     * The following limitations must be considered when implementing an
     * '_f_r' function:
     *  - 'static' variables are read-only
     *  - Global Data (gd->xxx) is read/write
     *
     * The '_f_r' sequence must, as a minimum, copy U-Boot to RAM (if
     * supported).  It _should_, if possible, copy global data to RAM and
     * initialise the CPU caches (to speed up the relocation process)
     *
     * NOTE: At present only x86 uses this route, but it is intended that
     * all archs will move to this when generic relocation is implemented.
     */
    static init_fnc_t init_sequence_f_r[] = {
    	init_cache_f_r,
    
    	NULL,
    };
    
    void board_init_f_r(void)
    {
    	if (initcall_run_list(init_sequence_f_r))
    		hang();
    
    	/*
    	 * U-Boot has been copied into SDRAM, the BSS has been cleared etc.
    	 * Transfer execution from Flash to RAM by calculating the address
    	 * of the in-RAM copy of board_init_r() and calling it
    	 */
    	(board_init_r + gd->reloc_off)(gd, gd->relocaddr);
    
    	/* NOTREACHED - board_init_r() does not return */
    	hang();
    }
    
    #else
    ulong board_init_f_mem(ulong top)
    {
    	/* Leave space for the stack we are running with now */
    	top -= 0x40;
    
    	top -= sizeof(struct global_data);
    	top = ALIGN(top, 16);
    	gd = (struct global_data *)top;
    	memset((void *)gd, '\0', sizeof(*gd));
    
    #ifdef CONFIG_SYS_MALLOC_F_LEN
    	top -= CONFIG_SYS_MALLOC_F_LEN;
    	gd->malloc_base = top;
    #endif
    
    	return top;
    }
    
    #endif /* CONFIG_X86 */