[U-Boot] [RFC 3/3] MIPS: bootm.c: integrate QEMU specific functions

Gabor Juhos
2013-01-08T19:14:11Z

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 <juhosg@openwrt.org>
Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
---
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 at denx.de.
*
+ * (C) Copyright 2008
+ * Jean-Christophe PLAGNIOL-VILLARD <jcplagniol@jcrosoft.com>
+ *
* 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 <jcplagniol@jcrosoft.com>
- *
- * 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 <common.h>
-#include <command.h>
-#include <image.h>
-#include <asm/byteorder.h>
-#include <asm/addrspace.h>
-
-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;
-}
--
1.7.10