summaryrefslogtreecommitdiff
path: root/common/board_f.c
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2015-08-10 20:44:30 -0600
committerSimon Glass <sjg@chromium.org>2015-08-14 09:50:10 -0600
commit1fed87db6a6a2eea7f93667e98db41e258b9c8f0 (patch)
tree8dc105879389696980528ca1afa3c89092e3234a /common/board_f.c
parent2afddae07523f23f77acd066ad1719f53d289f98 (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.c13
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;