mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-31 19:41:46 +00:00
Allow arch-specific setting of global_data in board_init_f_mem()
At present we have a simple assignment to gd. With some archs this is implemented as a register or through some other means; a simple assignment does not suit in all cases. Change this to a function and add documentation to describe how this all works. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: York Sun <yorksun@freescale.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
2afddae075
commit
1fed87db6a
2 changed files with 54 additions and 2 deletions
|
@ -1027,16 +1027,25 @@ void board_init_f_r(void)
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_X86 */
|
#endif /* CONFIG_X86 */
|
||||||
|
|
||||||
|
/* Unfortunately x86 can't compile this code as gd cannot be assigned */
|
||||||
#ifndef CONFIG_X86
|
#ifndef CONFIG_X86
|
||||||
|
__weak void arch_setup_gd(struct global_data *gd_ptr)
|
||||||
|
{
|
||||||
|
gd = gd_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
ulong board_init_f_mem(ulong top)
|
ulong board_init_f_mem(ulong top)
|
||||||
{
|
{
|
||||||
|
struct global_data *gd_ptr;
|
||||||
|
|
||||||
/* Leave space for the stack we are running with now */
|
/* Leave space for the stack we are running with now */
|
||||||
top -= 0x40;
|
top -= 0x40;
|
||||||
|
|
||||||
top -= sizeof(struct global_data);
|
top -= sizeof(struct global_data);
|
||||||
top = ALIGN(top, 16);
|
top = ALIGN(top, 16);
|
||||||
gd = (struct global_data *)top;
|
gd_ptr = (struct global_data *)top;
|
||||||
memset((void *)gd, '\0', sizeof(*gd));
|
memset(gd_ptr, '\0', sizeof(*gd));
|
||||||
|
arch_setup_gd(gd_ptr);
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_MALLOC_F_LEN
|
#ifdef CONFIG_SYS_MALLOC_F_LEN
|
||||||
top -= CONFIG_SYS_MALLOC_F_LEN;
|
top -= CONFIG_SYS_MALLOC_F_LEN;
|
||||||
|
|
|
@ -217,6 +217,49 @@ extern char console_buffer[];
|
||||||
/* arch/$(ARCH)/lib/board.c */
|
/* arch/$(ARCH)/lib/board.c */
|
||||||
void board_init_f(ulong);
|
void board_init_f(ulong);
|
||||||
void board_init_r(gd_t *, ulong) __attribute__ ((noreturn));
|
void board_init_r(gd_t *, ulong) __attribute__ ((noreturn));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* board_init_f_mem() - Allocate global data and set stack position
|
||||||
|
*
|
||||||
|
* This function is called by each architecture very early in the start-up
|
||||||
|
* code to set up the environment for board_init_f(). It allocates space for
|
||||||
|
* global_data (see include/asm-generic/global_data.h) and places the stack
|
||||||
|
* below this.
|
||||||
|
*
|
||||||
|
* This function requires a stack[1] Normally this is at @top. The function
|
||||||
|
* starts allocating space from 64 bytes below @top. First it creates space
|
||||||
|
* for global_data. Then it calls arch_setup_gd() which sets gd to point to
|
||||||
|
* the global_data space and can reserve additional bytes of space if
|
||||||
|
* required). Finally it allocates early malloc() memory
|
||||||
|
* (CONFIG_SYS_MALLOC_F_LEN). The new top of the stack is just below this,
|
||||||
|
* and it returned by this function.
|
||||||
|
*
|
||||||
|
* [1] Strictly speaking it would be possible to implement this function
|
||||||
|
* in C on many archs such that it does not require a stack. However this
|
||||||
|
* does not seem hugely important as only 64 byte are wasted. The 64 bytes
|
||||||
|
* are used to handle the calling standard which generally requires pushing
|
||||||
|
* addresses or registers onto the stack. We should be able to get away with
|
||||||
|
* less if this becomes important.
|
||||||
|
*
|
||||||
|
* @top: Top of available memory, also normally the top of the stack
|
||||||
|
* @return: New stack location
|
||||||
|
*/
|
||||||
|
ulong board_init_f_mem(ulong top);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* arch_setup_gd() - Set up the global_data pointer
|
||||||
|
*
|
||||||
|
* This pointer is special in some architectures and cannot easily be assigned
|
||||||
|
* to. For example on x86 it is implemented by adding a specific record to its
|
||||||
|
* Global Descriptor Table! So we we provide a function to carry out this task.
|
||||||
|
* For most architectures this can simply be:
|
||||||
|
*
|
||||||
|
* gd = gd_ptr;
|
||||||
|
*
|
||||||
|
* @gd_ptr: Pointer to global data
|
||||||
|
*/
|
||||||
|
void arch_setup_gd(gd_t *gd_ptr);
|
||||||
|
|
||||||
int checkboard(void);
|
int checkboard(void);
|
||||||
int show_board_info(void);
|
int show_board_info(void);
|
||||||
int checkflash(void);
|
int checkflash(void);
|
||||||
|
|
Loading…
Add table
Reference in a new issue