bootm: refactor ramdisk locating code
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>
This commit is contained in:
parent
c160a95447
commit
c4f9419c6b
@ -116,6 +116,33 @@ void __board_lmb_reserve(struct lmb *lmb)
|
|||||||
}
|
}
|
||||||
void board_lmb_reserve(struct lmb *lmb) __attribute__((weak, alias("__board_lmb_reserve")));
|
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 */
|
/* 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 load_start, load_end;
|
||||||
ulong mem_start;
|
ulong mem_start;
|
||||||
phys_size_t mem_size;
|
phys_size_t mem_size;
|
||||||
|
int ret;
|
||||||
|
|
||||||
struct lmb lmb;
|
struct lmb lmb;
|
||||||
|
|
||||||
@ -222,6 +250,16 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
|||||||
return 1;
|
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;
|
image_start = (ulong)os_hdr;
|
||||||
load_end = 0;
|
load_end = 0;
|
||||||
type_name = genimg_get_type_name (type);
|
type_name = genimg_get_type_name (type);
|
||||||
|
@ -221,6 +221,8 @@ typedef struct bootm_headers {
|
|||||||
|
|
||||||
ulong ep; /* entry point of OS */
|
ulong ep; /* entry point of OS */
|
||||||
|
|
||||||
|
ulong rd_start, rd_end;/* ramdisk start/end */
|
||||||
|
|
||||||
int verify; /* getenv("verify")[0] != 'n' */
|
int verify; /* getenv("verify")[0] != 'n' */
|
||||||
struct lmb *lmb; /* for memory mgmt */
|
struct lmb *lmb; /* for memory mgmt */
|
||||||
} bootm_headers_t;
|
} bootm_headers_t;
|
||||||
|
@ -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[],
|
void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
|
||||||
bootm_headers_t *images)
|
bootm_headers_t *images)
|
||||||
{
|
{
|
||||||
ulong initrd_start, initrd_end;
|
|
||||||
bd_t *bd = gd->bd;
|
bd_t *bd = gd->bd;
|
||||||
char *s;
|
char *s;
|
||||||
int machid = bd->bi_arch_number;
|
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);
|
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);
|
show_boot_progress (15);
|
||||||
|
|
||||||
debug ("## Transferring control to Linux (at address %08lx) ...\n",
|
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);
|
setup_commandline_tag (bd, commandline);
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_INITRD_TAG
|
#ifdef CONFIG_INITRD_TAG
|
||||||
if (initrd_start && initrd_end)
|
if (images->rd_start && images->rd_end)
|
||||||
setup_initrd_tag (bd, initrd_start, initrd_end);
|
setup_initrd_tag (bd, images->rd_start, images->rd_end);
|
||||||
#endif
|
#endif
|
||||||
#if defined (CONFIG_VFD) || defined (CONFIG_LCD)
|
#if defined (CONFIG_VFD) || defined (CONFIG_LCD)
|
||||||
setup_videolfb_tag ((gd_t *) gd);
|
setup_videolfb_tag ((gd_t *) gd);
|
||||||
|
@ -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[],
|
void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
|
||||||
bootm_headers_t *images)
|
bootm_headers_t *images)
|
||||||
{
|
{
|
||||||
ulong initrd_start, initrd_end;
|
|
||||||
void (*theKernel)(int magic, void *tagtable);
|
void (*theKernel)(int magic, void *tagtable);
|
||||||
struct tag *params, *params_start;
|
struct tag *params, *params_start;
|
||||||
char *commandline = getenv("bootargs");
|
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;
|
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);
|
show_boot_progress (15);
|
||||||
|
|
||||||
params = params_start = (struct tag *)gd->bd->bi_boot_params;
|
params = params_start = (struct tag *)gd->bd->bi_boot_params;
|
||||||
params = setup_start_tag(params);
|
params = setup_start_tag(params);
|
||||||
params = setup_memory_tags(params);
|
params = setup_memory_tags(params);
|
||||||
if (initrd_start) {
|
if (images->rd_start) {
|
||||||
params = setup_ramdisk_tag(params,
|
params = setup_ramdisk_tag(params,
|
||||||
PHYSADDR(initrd_start),
|
PHYSADDR(images->rd_start),
|
||||||
PHYSADDR(initrd_end));
|
PHYSADDR(images->rd_end));
|
||||||
}
|
}
|
||||||
params = setup_commandline_tag(params, commandline);
|
params = setup_commandline_tag(params, commandline);
|
||||||
params = setup_clock_tags(params);
|
params = setup_clock_tags(params);
|
||||||
|
@ -36,7 +36,6 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
|
|||||||
{
|
{
|
||||||
void *base_ptr;
|
void *base_ptr;
|
||||||
ulong os_data, os_len;
|
ulong os_data, os_len;
|
||||||
ulong initrd_start, initrd_end;
|
|
||||||
image_header_t *hdr;
|
image_header_t *hdr;
|
||||||
int ret;
|
int ret;
|
||||||
#if defined(CONFIG_FIT)
|
#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;
|
size_t len;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_I386,
|
|
||||||
&initrd_start, &initrd_end);
|
|
||||||
if (ret)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (images->legacy_hdr_valid) {
|
if (images->legacy_hdr_valid) {
|
||||||
hdr = images->legacy_hdr_os;
|
hdr = images->legacy_hdr_os;
|
||||||
if (image_check_type (hdr, IH_TYPE_MULTI)) {
|
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,
|
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) {
|
if (NULL == base_ptr) {
|
||||||
printf ("## Kernel loading failed ...\n");
|
printf ("## Kernel loading failed ...\n");
|
||||||
|
@ -50,7 +50,7 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag,
|
|||||||
{
|
{
|
||||||
ulong sp;
|
ulong sp;
|
||||||
|
|
||||||
ulong rd_data_start, rd_data_end, rd_len;
|
ulong rd_len;
|
||||||
ulong initrd_start, initrd_end;
|
ulong initrd_start, initrd_end;
|
||||||
int ret;
|
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;
|
kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))images->ep;
|
||||||
|
|
||||||
/* find ramdisk */
|
rd_len = images->rd_end - images->rd_start;
|
||||||
ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_M68K,
|
ret = boot_ramdisk_high (lmb, images->rd_start, rd_len,
|
||||||
&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,
|
|
||||||
&initrd_start, &initrd_end);
|
&initrd_start, &initrd_end);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -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[],
|
void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
|
||||||
bootm_headers_t *images)
|
bootm_headers_t *images)
|
||||||
{
|
{
|
||||||
ulong initrd_start, initrd_end;
|
|
||||||
void (*theKernel) (int, char **, char **, int *);
|
void (*theKernel) (int, char **, char **, int *);
|
||||||
char *commandline = getenv ("bootargs");
|
char *commandline = getenv ("bootargs");
|
||||||
char env_buf[12];
|
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 */
|
/* find kernel entry point */
|
||||||
theKernel = (void (*)(int, char **, char **, int *))images->ep;
|
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);
|
show_boot_progress (15);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#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);
|
linux_env_set ("memsize", env_buf);
|
||||||
|
|
||||||
sprintf (env_buf, "0x%08X", (uint) UNCACHED_SDRAM (initrd_start));
|
sprintf (env_buf, "0x%08X", (uint) UNCACHED_SDRAM (images->rd_start));
|
||||||
linux_env_set ("initrd_start", env_buf);
|
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);
|
linux_env_set ("initrd_size", env_buf);
|
||||||
|
|
||||||
sprintf (env_buf, "0x%08X", (uint) (gd->bd->bi_flashstart));
|
sprintf (env_buf, "0x%08X", (uint) (gd->bd->bi_flashstart));
|
||||||
|
@ -73,7 +73,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
|
|||||||
ulong sp;
|
ulong sp;
|
||||||
|
|
||||||
ulong initrd_start, initrd_end;
|
ulong initrd_start, initrd_end;
|
||||||
ulong rd_data_start, rd_data_end, rd_len;
|
ulong rd_len;
|
||||||
ulong size;
|
ulong size;
|
||||||
phys_size_t bootm_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);
|
set_clocks_in_mhz(kbd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* find ramdisk */
|
rd_len = images->rd_end - images->rd_start;
|
||||||
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;
|
|
||||||
|
|
||||||
#if defined(CONFIG_OF_LIBFDT)
|
#if defined(CONFIG_OF_LIBFDT)
|
||||||
ret = boot_relocate_fdt (lmb, bootmap_base,
|
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) {
|
if (of_size) {
|
||||||
/* pass in dummy initrd info, we'll fix up later */
|
/* 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");
|
fdt_error ("/chosen node create failed");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -221,7 +215,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_OF_LIBFDT */
|
#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)
|
if (ret)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
@ -235,7 +229,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
|
|||||||
/* Look for the dummy entry and delete it */
|
/* Look for the dummy entry and delete it */
|
||||||
for (j = 0; j < total; j++) {
|
for (j = 0; j < total; j++) {
|
||||||
fdt_get_mem_rsv(of_flat_tree, j, &addr, &size);
|
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);
|
fdt_del_mem_rsv(of_flat_tree, j);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,7 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
|
|||||||
char *bootargs;
|
char *bootargs;
|
||||||
ulong load;
|
ulong load;
|
||||||
ulong initrd_start, initrd_end;
|
ulong initrd_start, initrd_end;
|
||||||
ulong rd_data_start, rd_data_end, rd_len;
|
ulong rd_len;
|
||||||
unsigned int data, len, checksum;
|
unsigned int data, len, checksum;
|
||||||
unsigned int initrd_addr, kernend;
|
unsigned int initrd_addr, kernend;
|
||||||
void (*kernel) (struct linux_romvec *, void *);
|
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.
|
* 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 */
|
/* 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) {
|
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);
|
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);
|
&initrd_start, &initrd_end);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
puts("### Failed to relocate RAM disk\n");
|
puts("### Failed to relocate RAM disk\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user