From patchwork Mon Aug 27 23:18:37 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Rini X-Patchwork-Id: 180301 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 9FCC82C00CB for ; Tue, 28 Aug 2012 09:22:08 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id D91E8280C2; Tue, 28 Aug 2012 01:21:39 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id KmHfKxVJFsok; Tue, 28 Aug 2012 01:21:39 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 54F94280CB; Tue, 28 Aug 2012 01:20:10 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id E17F52809E for ; Tue, 28 Aug 2012 01:19:58 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8itbIo1VSPpA for ; Tue, 28 Aug 2012 01:19:57 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-pb0-f44.google.com (mail-pb0-f44.google.com [209.85.160.44]) by theia.denx.de (Postfix) with ESMTPS id DE19228088 for ; Tue, 28 Aug 2012 01:19:11 +0200 (CEST) Received: by mail-pb0-f44.google.com with SMTP id rr4so8206516pbb.3 for ; Mon, 27 Aug 2012 16:19:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=XTFngUDry6AP1eAJe4gqNMwa6UVegL94dPwuSQMR6MA=; b=ZMM+pNzNOinur81RwPxsaKXysHdploDWl9A6gONatEclTW+tjG8svuZUlg3TYEOY3q cZP/WOJnIY/H3zFLh90VJxj7ZoIeXUQohLB5b+F9bW8pc3ZcIAxwLAElQXIxdRpjkpfq 5G3hz1OFxqDRXE3zy8GeDUbPRVFNvCbMaVH/9XybUZXb3oeNEIgB9+B5rO72AOrSlJMm qbrxcu2MujeHKHmy4phFeM8EK3iAX7KOZiizFJMeIa0O11ZMBrBQm6FOzlZjDVRz3bsv /iosYFrmLcmImLuXvxfju/gqFamEZO7B59xElosuwdqsTHjT5kE3C3hdykp8ogrojrqO YiiA== Received: by 10.66.87.227 with SMTP id bb3mr33868544pab.3.1346109551282; Mon, 27 Aug 2012 16:19:11 -0700 (PDT) Received: from localhost.localdomain (ip68-230-54-74.ph.ph.cox.net. [68.230.54.74]) by mx.google.com with ESMTPS id wn1sm15616267pbc.57.2012.08.27.16.19.09 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 27 Aug 2012 16:19:10 -0700 (PDT) From: Tom Rini To: u-boot@lists.denx.de Date: Mon, 27 Aug 2012 16:18:37 -0700 Message-Id: <1346109527-17182-16-git-send-email-trini@ti.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1346109527-17182-1-git-send-email-trini@ti.com> References: <1346109527-17182-1-git-send-email-trini@ti.com> Cc: Sudhakar Rajashekhara , Christian Riesch Subject: [U-Boot] [PATCH v5 15/25] SPL: Create arch/arm/lib/spl.c for board_init_f and jump_to_image_linux X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de In SPL (CONFIG_SPL_FRAMEWORK) board_init_f must setup the stack pointer, clear the BSS and call board_init_r. We mark this as weak as some platforms may need to perform additional initalization at this point. We provide a gd that we know will be in a usable location, once the BSS has been cleared to help with this as well. Finally, we no longer call relocate_code so remove that from the armv7 version. Next, both board_init_f and jump_to_image_linux are going to be inherently arch-specific, so move these versions to arch/arm/lib/spl.c Signed-off-by: Tom Rini --- Changes in v4: - Based on PowerPC, use memset to clear BSS rather than relocate_code - Document what board_init_f must do - Make board_init_f setup the global data pointer, after clearing BSS. - Move board_init_f / jump_to_image_linux to arch/arm/lib/spl.c Changes in v5: - After seeing Stefan's PowerPC series, move gdata to arch/arm/lib/spl.c arch/arm/cpu/armv7/start.S | 13 ++------ arch/arm/include/asm/spl.h | 2 ++ arch/arm/lib/Makefile | 2 ++ arch/arm/lib/spl.c | 74 ++++++++++++++++++++++++++++++++++++++++++++ common/spl/spl.c | 36 ++------------------- include/spl.h | 2 ++ 6 files changed, 84 insertions(+), 45 deletions(-) create mode 100644 arch/arm/lib/spl.c diff --git a/arch/arm/cpu/armv7/start.S b/arch/arm/cpu/armv7/start.S index aee27fd..47db102 100644 --- a/arch/arm/cpu/armv7/start.S +++ b/arch/arm/cpu/armv7/start.S @@ -166,6 +166,7 @@ call_board_init_f: /*------------------------------------------------------------------------------*/ +#ifndef CONFIG_SPL_BUILD /* * void relocate_code (addr_sp, gd, addr_moni) * @@ -196,7 +197,6 @@ copy_loop: cmp r0, r2 /* until source end address [r2] */ blo copy_loop -#ifndef CONFIG_SPL_BUILD /* * fix .rel.dyn relocations */ @@ -243,20 +243,12 @@ _rel_dyn_end_ofs: _dynsym_start_ofs: .word __dynsym_start - _start -#endif /* #ifndef CONFIG_SPL_BUILD */ - clear_bss: -#ifdef CONFIG_SPL_BUILD - /* No relocation for SPL */ - ldr r0, =__bss_start - ldr r1, =__bss_end__ -#else ldr r0, _bss_start_ofs ldr r1, _bss_end_ofs mov r4, r6 /* reloc addr */ add r0, r0, r4 add r1, r1, r4 -#endif mov r2, #0x00000000 /* clear */ clbss_l:cmp r0, r1 /* clear loop... */ @@ -283,12 +275,10 @@ jump_2_ram: * Move vector table */ #if !defined(CONFIG_TEGRA2) -#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD)) /* Set vector address in CP15 VBAR register */ ldr r0, =_start add r0, r0, r9 mcr p15, 0, r0, c12, c0, 0 @Set VBAR -#endif #endif /* !Tegra2 */ ldr r0, _board_init_r_ofs @@ -304,6 +294,7 @@ jump_2_ram: _board_init_r_ofs: .word board_init_r - _start ENDPROC(relocate_code) +#endif /************************************************************************* * diff --git a/arch/arm/include/asm/spl.h b/arch/arm/include/asm/spl.h index ad61990..c8111c8 100644 --- a/arch/arm/include/asm/spl.h +++ b/arch/arm/include/asm/spl.h @@ -26,4 +26,6 @@ /* Platform-specific defines */ #include +extern gd_t gdata; + #endif diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 39a9550..c892f82 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -44,6 +44,8 @@ COBJS-y += interrupts.o COBJS-y += reset.o SOBJS-$(CONFIG_USE_ARCH_MEMSET) += memset.o SOBJS-$(CONFIG_USE_ARCH_MEMCPY) += memcpy.o +else +COBJS-$(CONFIG_SPL_FRAMEWORK) += spl.o endif COBJS-y += cache.o diff --git a/arch/arm/lib/spl.c b/arch/arm/lib/spl.c new file mode 100644 index 0000000..bfe651c --- /dev/null +++ b/arch/arm/lib/spl.c @@ -0,0 +1,74 @@ +/* + * (C) Copyright 2010-2012 + * Texas Instruments, + * + * Aneesh V + * Tom Rini + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ +#include +#include +#include +#include +#include + +/* Pointer to as well as the global data structure for SPL */ +DECLARE_GLOBAL_DATA_PTR; +gd_t gdata __attribute__ ((section(".data"))); + +extern char __bss_start[], __bss_end__[]; + +/* + * In the context of SPL, board_init_f must ensure that any clocks/etc for + * DDR are enabled, ensure that the stack pointer is valid, clear the BSS + * and call board_init_f. We provide this version by default but mark it + * as __weak to allow for platforms to do this in their own way if needed. + */ +void __weak board_init_f(ulong dummy) +{ + /* Set the stack pointer. */ + asm volatile("mov sp, %0\n" : : "r"(CONFIG_SPL_STACK)); + + /* Clear the BSS. */ + memset(__bss_start, 0, __bss_end__ - __bss_start); + + /* Set global data pointer. */ + gd = &gdata; + + board_init_r(NULL, 0); +} + +/* + * This function jumps to an image with argument. Normally an FDT or ATAGS + * image. + * arg: Pointer to paramter image in RAM + */ +#ifdef CONFIG_SPL_OS_BOOT +void __noreturn jump_to_image_linux(void *arg) +{ + debug("Entering kernel arg pointer: 0x%p\n", arg); + typedef void (*image_entry_arg_t)(int, int, void *) + __attribute__ ((noreturn)); + image_entry_arg_t image_entry = + (image_entry_arg_t) spl_image.entry_point; + cleanup_before_linux(); + image_entry(0, CONFIG_MACH_TYPE, arg); +} +#endif diff --git a/common/spl/spl.c b/common/spl/spl.c index 1562f2a..25610ef 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -38,8 +38,7 @@ DECLARE_GLOBAL_DATA_PTR; u32 *boot_params_ptr = NULL; struct spl_image_info spl_image; -/* Define global data structure pointer to it*/ -static gd_t gdata __attribute__ ((section(".data"))); +/* Define board data structure */ static bd_t bdata __attribute__ ((section(".data"))); inline void hang(void) @@ -49,18 +48,6 @@ inline void hang(void) ; } -void board_init_f(ulong dummy) -{ - /* - * We call relocate_code() with relocation target same as the - * CONFIG_SYS_SPL_TEXT_BASE. This will result in relocation getting - * skipped. Instead, only .bss initialization will happen. That's - * all we need - */ - debug(">>board_init_f()\n"); - relocate_code(CONFIG_SPL_STACK, &gdata, CONFIG_SPL_TEXT_BASE); -} - /* * Default function to determine if u-boot or the OS should * be started. This implementation always returns 1. @@ -107,24 +94,6 @@ void spl_parse_image_header(const struct image_header *header) } } -/* - * This function jumps to an image with argument. Normally an FDT or ATAGS - * image. - * arg: Pointer to paramter image in RAM - */ -#ifdef CONFIG_SPL_OS_BOOT -static void __noreturn jump_to_image_linux(void *arg) -{ - debug("Entering kernel arg pointer: 0x%p\n", arg); - typedef void (*image_entry_arg_t)(int, int, void *) - __attribute__ ((noreturn)); - image_entry_arg_t image_entry = - (image_entry_arg_t) spl_image.entry_point; - cleanup_before_linux(); - image_entry(0, CONFIG_MACH_TYPE, arg); -} -#endif - static void __noreturn jump_to_image_no_args(void) { typedef void __noreturn (*image_entry_noargs_t)(u32 *); @@ -140,7 +109,7 @@ static void __noreturn jump_to_image_no_args(void) image_entry((u32 *)boot_params_ptr_addr); } -void board_init_r(gd_t *id, ulong dummy) +void board_init_r(gd_t *dummy1, ulong dummy2) { u32 boot_device; debug(">>spl:board_init_r()\n"); @@ -207,7 +176,6 @@ void board_init_r(gd_t *id, ulong dummy) /* This requires UART clocks to be enabled */ void preloader_console_init(void) { - gd = &gdata; gd->bd = &bdata; gd->flags |= GD_FLG_RELOC; gd->baudrate = CONFIG_BAUDRATE; diff --git a/include/spl.h b/include/spl.h index af9ef71..2923cd2 100644 --- a/include/spl.h +++ b/include/spl.h @@ -24,6 +24,7 @@ #define _SPL_H_ /* Platform-specific defines */ +#include #include /* Boot type */ @@ -48,6 +49,7 @@ u32 spl_boot_device(void); u32 spl_boot_mode(void); void spl_parse_image_header(const struct image_header *header); void spl_board_prepare_for_linux(void); +void __noreturn jump_to_image_linux(void *arg); int spl_start_uboot(void); void spl_display_print(void);