diff options
author | Simon Glass <sjg@chromium.org> | 2015-08-10 20:44:30 -0600 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2015-08-14 09:50:10 -0600 |
commit | 1fed87db6a6a2eea7f93667e98db41e258b9c8f0 (patch) | |
tree | 8dc105879389696980528ca1afa3c89092e3234a /common/board_f.c | |
parent | 2afddae07523f23f77acd066ad1719f53d289f98 (diff) |
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>
Diffstat (limited to 'common/board_f.c')
-rw-r--r-- | common/board_f.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/common/board_f.c b/common/board_f.c index 74f77f1ea1..37b7bf5e36 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -1027,16 +1027,25 @@ void board_init_f_r(void) } #endif /* CONFIG_X86 */ +/* Unfortunately x86 can't compile this code as gd cannot be assigned */ #ifndef CONFIG_X86 +__weak void arch_setup_gd(struct global_data *gd_ptr) +{ + gd = gd_ptr; +} + ulong board_init_f_mem(ulong top) { + struct global_data *gd_ptr; + /* 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)); + gd_ptr = (struct global_data *)top; + memset(gd_ptr, '\0', sizeof(*gd)); + arch_setup_gd(gd_ptr); #ifdef CONFIG_SYS_MALLOC_F_LEN top -= CONFIG_SYS_MALLOC_F_LEN; |