From mboxrd@z Thu Jan 1 00:00:00 1970 From: York Sun Date: Mon, 3 Aug 2015 08:58:20 -0700 Subject: [U-Boot] [PATCH 3/5] Allow arch-specific setting of global_data in board_init_f_mem() In-Reply-To: <1438560612-29910-4-git-send-email-sjg@chromium.org> References: <1438560612-29910-1-git-send-email-sjg@chromium.org> <1438560612-29910-4-git-send-email-sjg@chromium.org> Message-ID: <55BF8F9C.10704@freescale.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 08/02/2015 05:10 PM, Simon Glass wrote: > 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 > --- > > common/board_f.c | 14 +++++++++++--- > include/common.h | 40 ++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 51 insertions(+), 3 deletions(-) > > diff --git a/common/board_f.c b/common/board_f.c > index a947770..3d1f305 100644 > --- a/common/board_f.c > +++ b/common/board_f.c > @@ -1024,15 +1024,23 @@ void board_init_f_r(void) > #endif /* CONFIG_X86 */ > > #ifndef CONFIG_X86 > -ulong board_init_f_mem(ulong top) > +__weak void arch_setup_gdt(struct global_data *gd_ptr) > { > + gd = gd_ptr; > +} > + > +ulong board_init_f_mem(ulong top, ulong reserve_size) > +{ > + 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_gdt(gd_ptr); > > #ifdef CONFIG_SYS_MALLOC_F_LEN > top -= CONFIG_SYS_MALLOC_F_LEN; > diff --git a/include/common.h b/include/common.h > index fcc9ae7..029eb1f 100644 > --- a/include/common.h > +++ b/include/common.h > @@ -217,6 +217,46 @@ extern char console_buffer[]; > /* arch/$(ARCH)/lib/board.c */ > void board_init_f(ulong); > 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. > + * > + * @top: Top of available memory, also normally the top of the stack > + * @return: New stack location > + */ > +ulong board_init_f_mem(ulong top, ulong reserve_size); > + > +/** > + * arch_setup_gdt() - 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_gdt(gd_t *gd_ptr); > + > int checkboard(void); > int show_board_info(void); > int checkflash(void); > This looks good to me. Reviewed-by: York Sun York