From: Kumar Gala <galak@kernel.crashing.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [WIP][PATCH 05/11] bootm: refactor ramdisk locating code
Date: Tue, 12 Aug 2008 08:44:30 -0500 [thread overview]
Message-ID: <1218548676-25159-6-git-send-email-galak@kernel.crashing.org> (raw)
In-Reply-To: <1218548676-25159-5-git-send-email-galak@kernel.crashing.org>
Move determing if we have a ramdisk and where its located into the common
code. Keep track of the ramdisk start and end in the bootm_headers_t image
struct.
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
---
common/cmd_bootm.c | 38 ++++++++++++++++++++++++++++++++++++++
include/image.h | 2 ++
lib_arm/bootm.c | 10 ++--------
lib_avr32/bootm.c | 12 +++---------
lib_i386/bootm.c | 8 +-------
lib_m68k/bootm.c | 12 +++---------
lib_mips/bootm.c | 12 +++---------
lib_ppc/bootm.c | 16 +++++-----------
lib_sparc/bootm.c | 17 +++--------------
9 files changed, 60 insertions(+), 67 deletions(-)
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 3f63b84..56236b9 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -116,6 +116,33 @@ void __board_lmb_reserve(struct lmb *lmb)
}
void board_lmb_reserve(struct lmb *lmb) __attribute__((weak, alias("__board_lmb_reserve")));
+#if defined(__ARM__)
+ #define IH_INITRD_ARCH IH_ARCH_ARM
+#elif defined(__avr32__)
+ #define IH_INITRD_ARCH IH_ARCH_AVR32
+#elif defined(__bfin__)
+ #define IH_INITRD_ARCH IH_ARCH_BLACKFIN
+#elif defined(__I386__)
+ #define IH_INITRD_ARCH IH_ARCH_I386
+#elif defined(__M68K__)
+ #define IH_INITRD_ARCH IH_ARCH_M68K
+#elif defined(__microblaze__)
+ #define IH_INITRD_ARCH IH_ARCH_MICROBLAZE
+#elif defined(__mips__)
+ #define IH_INITRD_ARCH IH_ARCH_MIPS
+#elif defined(__nios__)
+ #define IH_INITRD_ARCH IH_ARCH_NIOS
+#elif defined(__nios2__)
+ #define IH_INITRD_ARCH IH_ARCH_NIOS2
+#elif defined(__PPC__)
+ #define IH_INITRD_ARCH IH_ARCH_PPC
+#elif defined(__sh__)
+ #define IH_INITRD_ARCH IH_ARCH_SH
+#elif defined(__sparc__)
+ #define IH_INITRD_ARCH IH_ARCH_SPARC
+#else
+# error Unknown CPU type
+#endif
/*******************************************************************/
/* bootm - boot application image from image in memory */
@@ -133,6 +160,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
ulong load_start, load_end;
ulong mem_start;
phys_size_t mem_size;
+ int ret;
struct lmb lmb;
@@ -222,6 +250,16 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
return 1;
}
+ if (os == IH_OS_LINUX) {
+ /* find ramdisk */
+ ret = boot_get_ramdisk (argc, argv, &images, IH_INITRD_ARCH,
+ &images.rd_start, &images.rd_end);
+ if (ret) {
+ puts ("Ramdisk image is corrupt\n");
+ return 1;
+ }
+ }
+
image_start = (ulong)os_hdr;
load_end = 0;
type_name = genimg_get_type_name (type);
diff --git a/include/image.h b/include/image.h
index e16c253..b8577a0 100644
--- a/include/image.h
+++ b/include/image.h
@@ -221,6 +221,8 @@ typedef struct bootm_headers {
ulong ep; /* entry point of OS */
+ ulong rd_start, rd_end;/* ramdisk start/end */
+
int verify; /* getenv("verify")[0] != 'n' */
struct lmb *lmb; /* for memory mgmt */
} bootm_headers_t;
diff --git a/lib_arm/bootm.c b/lib_arm/bootm.c
index 5660a50..f9f702f 100644
--- a/lib_arm/bootm.c
+++ b/lib_arm/bootm.c
@@ -61,7 +61,6 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
bootm_headers_t *images)
{
- ulong initrd_start, initrd_end;
bd_t *bd = gd->bd;
char *s;
int machid = bd->bi_arch_number;
@@ -80,11 +79,6 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
printf ("Using machid 0x%x from environment\n", machid);
}
- ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_ARM,
- &initrd_start, &initrd_end);
- if (ret)
- goto error;
-
show_boot_progress (15);
debug ("## Transferring control to Linux (at address %08lx) ...\n",
@@ -111,8 +105,8 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
setup_commandline_tag (bd, commandline);
#endif
#ifdef CONFIG_INITRD_TAG
- if (initrd_start && initrd_end)
- setup_initrd_tag (bd, initrd_start, initrd_end);
+ if (images->rd_start && images->rd_end)
+ setup_initrd_tag (bd, images->rd_start, images->rd_end);
#endif
#if defined (CONFIG_VFD) || defined (CONFIG_LCD)
setup_videolfb_tag ((gd_t *) gd);
diff --git a/lib_avr32/bootm.c b/lib_avr32/bootm.c
index 7beab99..762701f 100644
--- a/lib_avr32/bootm.c
+++ b/lib_avr32/bootm.c
@@ -176,7 +176,6 @@ static void setup_end_tag(struct tag *params)
void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
bootm_headers_t *images)
{
- ulong initrd_start, initrd_end;
void (*theKernel)(int magic, void *tagtable);
struct tag *params, *params_start;
char *commandline = getenv("bootargs");
@@ -184,20 +183,15 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
theKernel = (void *)images->ep;
- ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_AVR32,
- &initrd_start, &initrd_end);
- if (ret)
- goto error;
-
show_boot_progress (15);
params = params_start = (struct tag *)gd->bd->bi_boot_params;
params = setup_start_tag(params);
params = setup_memory_tags(params);
- if (initrd_start) {
+ if (images->rd_start) {
params = setup_ramdisk_tag(params,
- PHYSADDR(initrd_start),
- PHYSADDR(initrd_end));
+ PHYSADDR(images->rd_start),
+ PHYSADDR(images->rd_end));
}
params = setup_commandline_tag(params, commandline);
params = setup_clock_tags(params);
diff --git a/lib_i386/bootm.c b/lib_i386/bootm.c
index 452eef7..8c0b225 100644
--- a/lib_i386/bootm.c
+++ b/lib_i386/bootm.c
@@ -36,7 +36,6 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
{
void *base_ptr;
ulong os_data, os_len;
- ulong initrd_start, initrd_end;
image_header_t *hdr;
int ret;
#if defined(CONFIG_FIT)
@@ -44,11 +43,6 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
size_t len;
#endif
- ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_I386,
- &initrd_start, &initrd_end);
- if (ret)
- goto error;
-
if (images->legacy_hdr_valid) {
hdr = images->legacy_hdr_os;
if (image_check_type (hdr, IH_TYPE_MULTI)) {
@@ -76,7 +70,7 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
}
base_ptr = load_zimage ((void*)os_data, os_len,
- initrd_start, initrd_end - initrd_start, 0);
+ images->rd_start, images->rd_end - images->rd_start, 0);
if (NULL == base_ptr) {
printf ("## Kernel loading failed ...\n");
diff --git a/lib_m68k/bootm.c b/lib_m68k/bootm.c
index fe658fe..241721d 100644
--- a/lib_m68k/bootm.c
+++ b/lib_m68k/bootm.c
@@ -50,7 +50,7 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag,
{
ulong sp;
- ulong rd_data_start, rd_data_end, rd_len;
+ ulong rd_len;
ulong initrd_start, initrd_end;
int ret;
@@ -95,14 +95,8 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag,
kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))images->ep;
- /* find ramdisk */
- ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_M68K,
- &rd_data_start, &rd_data_end);
- if (ret)
- goto error;
-
- rd_len = rd_data_end - rd_data_start;
- ret = boot_ramdisk_high (lmb, rd_data_start, rd_len,
+ rd_len = images->rd_end - images->rd_start;
+ ret = boot_ramdisk_high (lmb, images->rd_start, rd_len,
&initrd_start, &initrd_end);
if (ret)
goto error;
diff --git a/lib_mips/bootm.c b/lib_mips/bootm.c
index 7df6ce6..9869c33 100644
--- a/lib_mips/bootm.c
+++ b/lib_mips/bootm.c
@@ -48,7 +48,6 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
bootm_headers_t *images)
{
- ulong initrd_start, initrd_end;
void (*theKernel) (int, char **, char **, int *);
char *commandline = getenv ("bootargs");
char env_buf[12];
@@ -58,11 +57,6 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
/* find kernel entry point */
theKernel = (void (*)(int, char **, char **, int *))images->ep;
- ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_MIPS,
- &initrd_start, &initrd_end);
- if (ret)
- goto error;
-
show_boot_progress (15);
#ifdef DEBUG
@@ -82,10 +76,10 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
linux_env_set ("memsize", env_buf);
- sprintf (env_buf, "0x%08X", (uint) UNCACHED_SDRAM (initrd_start));
- linux_env_set ("initrd_start", env_buf);
+ sprintf (env_buf, "0x%08X", (uint) UNCACHED_SDRAM (images->rd_start));
+ linux_env_set ("images->rd_start", env_buf);
- sprintf (env_buf, "0x%X", (uint) (initrd_end - initrd_start));
+ sprintf (env_buf, "0x%X", (uint) (images->rd_end - images->rd_start));
linux_env_set ("initrd_size", env_buf);
sprintf (env_buf, "0x%08X", (uint) (gd->bd->bi_flashstart));
diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c
index b481c2a..942b891 100644
--- a/lib_ppc/bootm.c
+++ b/lib_ppc/bootm.c
@@ -73,7 +73,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
ulong sp;
ulong initrd_start, initrd_end;
- ulong rd_data_start, rd_data_end, rd_len;
+ ulong rd_len;
ulong size;
phys_size_t bootm_size;
@@ -153,13 +153,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
set_clocks_in_mhz(kbd);
}
- /* find ramdisk */
- ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_PPC,
- &rd_data_start, &rd_data_end);
- if (ret)
- goto error;
-
- rd_len = rd_data_end - rd_data_start;
+ rd_len = images->rd_end - images->rd_start;
#if defined(CONFIG_OF_LIBFDT)
ret = boot_relocate_fdt (lmb, bootmap_base,
@@ -171,7 +165,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
*/
if (of_size) {
/* pass in dummy initrd info, we'll fix up later */
- if (fdt_chosen(of_flat_tree, rd_data_start, rd_data_end, 0) < 0) {
+ if (fdt_chosen(of_flat_tree, images->rd_start, images->rd_end, 0) < 0) {
fdt_error ("/chosen node create failed");
goto error;
}
@@ -222,7 +216,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
}
#endif /* CONFIG_OF_LIBFDT */
- ret = boot_ramdisk_high (lmb, rd_data_start, rd_len, &initrd_start, &initrd_end);
+ ret = boot_ramdisk_high (lmb, images->rd_start, rd_len, &initrd_start, &initrd_end);
if (ret)
goto error;
@@ -236,7 +230,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
/* Look for the dummy entry and delete it */
for (j = 0; j < total; j++) {
fdt_get_mem_rsv(of_flat_tree, j, &addr, &size);
- if (addr == rd_data_start) {
+ if (addr == images->rd_start) {
fdt_del_mem_rsv(of_flat_tree, j);
break;
}
diff --git a/lib_sparc/bootm.c b/lib_sparc/bootm.c
index ac15396..71d34ba 100644
--- a/lib_sparc/bootm.c
+++ b/lib_sparc/bootm.c
@@ -89,7 +89,7 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
char *bootargs;
ulong load;
ulong initrd_start, initrd_end;
- ulong rd_data_start, rd_data_end, rd_len;
+ ulong rd_len;
unsigned int data, len, checksum;
unsigned int initrd_addr, kernend;
void (*kernel) (struct linux_romvec *, void *);
@@ -139,19 +139,8 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
* extracted and is writeable.
*/
- /*
- * Are we going to use an initrd image?
- */
- ret = boot_get_ramdisk(argc, argv, images, IH_ARCH_SPARC,
- &rd_data_start, &rd_data_end);
- if (ret) {
- /* RAM disk found but was corrupt */
- puts("RAM Disk corrupt\n");
- goto error;
- }
-
/* Calc length of RAM disk, if zero no ramdisk available */
- rd_len = rd_data_end - rd_data_start;
+ rd_len = images->rd_end - images->rd_start;
if (rd_len) {
@@ -161,7 +150,7 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
*/
lmb_reserve(lmb, CFG_RELOC_MONITOR_BASE, CFG_RAM_END);
- ret = boot_ramdisk_high(lmb, rd_data_start, rd_len,
+ ret = boot_ramdisk_high(lmb, images->rd_start, rd_len,
&initrd_start, &initrd_end);
if (ret) {
puts("### Failed to relocate RAM disk\n");
--
1.5.5.1
next prev parent reply other threads:[~2008-08-12 13:44 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-12 13:44 [U-Boot] [WIP][PATCH 00/11] bootm refactoring Kumar Gala
2008-08-12 13:44 ` [U-Boot] [WIP][PATCH 01/11] Update linux bootm to support ePAPR client interface Kumar Gala
2008-08-12 13:44 ` [U-Boot] [WIP][PATCH 02/11] add ability to disable ft_board_setup as part of bootm Kumar Gala
2008-08-12 13:44 ` [U-Boot] [WIP][PATCH 03/11] Clean up usage of icache_disable/dcache_disable Kumar Gala
2008-08-12 13:44 ` [U-Boot] [WIP][PATCH 04/11] bootm: refactor entry point code Kumar Gala
2008-08-12 13:44 ` Kumar Gala [this message]
2008-08-12 13:44 ` [U-Boot] [WIP][PATCH 06/11] bootm: refactor fdt locating and relocation code Kumar Gala
2008-08-12 13:44 ` [U-Boot] [WIP][PATCH 07/11] bootm: Set working fdt address as part of the bootm flow Kumar Gala
2008-08-12 13:44 ` [U-Boot] [WIP][PATCH 08/11] bootm: move lmb into the bootm_headers_t structure Kumar Gala
2008-08-12 13:44 ` [U-Boot] [WIP][PATCH 09/11] bootm: refactor image detection and os load steps Kumar Gala
2008-08-12 13:44 ` [U-Boot] [WIP][PATCH 10/11] fdt: refactor fdt resize code Kumar Gala
2008-08-12 13:44 ` [U-Boot] [WIP][PATCH 11/11] fdt: refactor initrd related code Kumar Gala
2008-08-13 5:12 ` [U-Boot] [WIP][PATCH 09/11] bootm: refactor image detection and os load steps Jerry Van Baren
2008-08-12 20:12 ` [U-Boot] [WIP][PATCH 00/11] bootm refactoring Wolfgang Denk
2008-08-12 20:17 ` Kumar Gala
2008-08-12 23:15 ` Wolfgang Denk
2008-08-13 1:01 ` Kumar Gala
2008-08-13 5:12 ` Jerry Van Baren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1218548676-25159-6-git-send-email-galak@kernel.crashing.org \
--to=galak@kernel.crashing.org \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.