From patchwork Tue Jan 8 19:14:11 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabor Juhos X-Patchwork-Id: 210484 X-Patchwork-Delegate: daniel.schwierzeck@googlemail.com 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 8BA062C0095 for ; Wed, 9 Jan 2013 06:14:34 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 9F4314A117; Tue, 8 Jan 2013 20:14:31 +0100 (CET) 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 Yrzx6IKHXrKY; Tue, 8 Jan 2013 20:14:31 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id C9DB84A145; Tue, 8 Jan 2013 20:14:25 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id D0E2B4A115 for ; Tue, 8 Jan 2013 20:14:21 +0100 (CET) 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 k4yy4WsCy-Z3 for ; Tue, 8 Jan 2013 20:14:20 +0100 (CET) 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 arrakis.dune.hu (arrakis.dune.hu [78.24.191.176]) by theia.denx.de (Postfix) with ESMTPS id 1352D4A117 for ; Tue, 8 Jan 2013 20:14:19 +0100 (CET) Received: from arrakis.dune.hu ([127.0.0.1]) by localhost (arrakis.dune.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id NAu8uLud4JMD; Tue, 8 Jan 2013 20:13:17 +0100 (CET) Received: from localhost.localdomain (catvpool-576570d8.szarvasnet.hu [87.101.112.216]) by arrakis.dune.hu (Postfix) with ESMTPSA id E820A28094C; Tue, 8 Jan 2013 20:13:16 +0100 (CET) From: Gabor Juhos To: u-boot@lists.denx.de Date: Tue, 8 Jan 2013 20:14:11 +0100 Message-Id: <1357672451-27455-3-git-send-email-juhosg@openwrt.org> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1357672451-27455-1-git-send-email-juhosg@openwrt.org> References: <1357672451-27455-1-git-send-email-juhosg@openwrt.org> Subject: [U-Boot] [RFC 3/3] MIPS: bootm.c: integrate QEMU specific functions 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 The linux starting code of the qemu specific bootm implementation is very similar to the one which is used for regular boards. The preparation code is different but it makes no sense to keep that in a separate file. The pach moves the qemu specific code into bootm.c, and removes the custom file. This allows to get rid of some duplicated code, and it collects bootm specific code into a single file. Additionaly, this allows to use the prep,go subcommands in qemu as well. Signed-off-by: Gabor Juhos Cc: Daniel Schwierzeck --- This is compile tested only. I don't have suitable kernel images for mips,mipsel,mips64,mipsel64 systems to try it yet. -Gabor --- arch/mips/lib/Makefile | 4 -- arch/mips/lib/bootm.c | 54 +++++++++++++++++++++++- arch/mips/lib/bootm_qemu_mips.c | 88 --------------------------------------- 3 files changed, 52 insertions(+), 94 deletions(-) delete mode 100644 arch/mips/lib/bootm_qemu_mips.c diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile index 967e98a..a68a564 100644 --- a/arch/mips/lib/Makefile +++ b/arch/mips/lib/Makefile @@ -35,11 +35,7 @@ LGOBJS := $(addprefix $(obj),$(GLSOBJS)) SOBJS-y += COBJS-y += board.o -ifeq ($(CONFIG_QEMU_MIPS),y) -COBJS-y += bootm_qemu_mips.o -else COBJS-y += bootm.o -endif SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y)) diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c index a36154a..71bd456 100644 --- a/arch/mips/lib/bootm.c +++ b/arch/mips/lib/bootm.c @@ -2,6 +2,9 @@ * (C) Copyright 2003 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * + * (C) Copyright 2008 + * Jean-Christophe PLAGNIOL-VILLARD + * * See file CREDITS for list of people who contributed to this * project. * @@ -33,6 +36,12 @@ DECLARE_GLOBAL_DATA_PTR; #define LINUX_MAX_ENVS 256 #define LINUX_MAX_ARGS 256 +#ifdef CONFIG_QEMU_MIPS +#define board_is_mips_qemu 1 +#else +#define board_is_mips_qemu 0 +#endif + static int linux_argc; static char **linux_argv; @@ -43,7 +52,7 @@ static int linux_env_idx; static void linux_params_init(ulong start, char *commandline); static void linux_env_set(char *env_name, char *env_val); -static void boot_prep_linux(bootm_headers_t *images) +static void boot_prep_linux_legacy(bootm_headers_t *images) { char *commandline = getenv("bootargs"); char env_buf[12]; @@ -83,6 +92,44 @@ static void boot_prep_linux(bootm_headers_t *images) linux_env_set("eth1addr", cp); } +static void boot_prep_linux_qemu(bootm_headers_t *images) +{ + char *bootargs = getenv("bootargs"); + char *start; + uint len; + + gd->bd->bi_boot_params = gd->bd->bi_memstart + (16 << 20) - 256; + debug("%-12s= 0x%08lX\n", "boot_params", (ulong)gd->bd->bi_boot_params); + + /* set Magic */ + *(int32_t *)(gd->bd->bi_boot_params - 4) = 0x12345678; + /* set ram_size */ + *(int32_t *)(gd->bd->bi_boot_params - 8) = gd->ram_size; + + start = (char *)gd->bd->bi_boot_params; + + len = strlen(bootargs); + + strncpy(start, bootargs, len + 1); + + start += len; + + len = images->rd_end - images->rd_start; + if (len > 0) { + start += sprintf(start, " rd_start=0x%08X rd_size=0x%0X", + (uint) UNCACHED_SDRAM(images->rd_start), + (uint) len); + } +} + +static void boot_prep_linux(bootm_headers_t *images) +{ + if (board_is_mips_qemu) + boot_prep_linux_qemu(images); + else + boot_prep_linux_legacy(images); +} + static void boot_jump_linux(bootm_headers_t *images) { void (*theKernel) (int, char **, char **, int *); @@ -98,7 +145,10 @@ static void boot_jump_linux(bootm_headers_t *images) /* we assume that the kernel is in place */ printf("\nStarting kernel ...\n\n"); - theKernel(linux_argc, linux_argv, linux_env, 0); + if (board_is_mips_qemu) + theKernel(0, NULL, NULL, 0); + else + theKernel(linux_argc, linux_argv, linux_env, 0); } int do_bootm_linux(int flag, int argc, char * const argv[], diff --git a/arch/mips/lib/bootm_qemu_mips.c b/arch/mips/lib/bootm_qemu_mips.c deleted file mode 100644 index a920305..0000000 --- a/arch/mips/lib/bootm_qemu_mips.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * (C) Copyright 2008 - * Jean-Christophe PLAGNIOL-VILLARD - * - * 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 - -DECLARE_GLOBAL_DATA_PTR; - -static void boot_prep_linux_qemu(bootm_headers_t *images) -{ - char *bootargs = getenv("bootargs"); - char *start; - uint len; - - gd->bd->bi_boot_params = gd->bd->bi_memstart + (16 << 20) - 256; - debug("%-12s= 0x%08lX\n", "boot_params", (ulong)gd->bd->bi_boot_params); - - /* set Magic */ - *(int32_t *)(gd->bd->bi_boot_params - 4) = 0x12345678; - /* set ram_size */ - *(int32_t *)(gd->bd->bi_boot_params - 8) = gd->ram_size; - - start = (char *)gd->bd->bi_boot_params; - - len = strlen(bootargs); - - strncpy(start, bootargs, len + 1); - - start += len; - - len = images->rd_end - images->rd_start; - if (len > 0) { - start += sprintf(start, " rd_start=0x%08X rd_size=0x%0X", - (uint) UNCACHED_SDRAM(images->rd_start), - (uint) len); - } -} - -static void boot_jump_linux_qemu(bootm_headers_t *images) -{ - void (*theKernel) (int, char **, char **, int *); - - /* find kernel entry point */ - theKernel = (void (*)(int, char **, char **, int *))images->ep; - - bootstage_mark(BOOTSTAGE_ID_RUN_OS); - - debug("## Transferring control to Linux (at address %08lx) ...\n", - (ulong) theKernel); - - /* we assume that the kernel is in place */ - printf("\nStarting kernel ...\n\n"); - - theKernel(0, NULL, NULL, 0); -} - -int do_bootm_linux(int flag, int argc, char * const argv[], - bootm_headers_t *images) -{ - boot_prep_linux_qemu(images); - boot_jump_linux_qemu(images); - - /* does not return */ - return 1; -}