diff options
Diffstat (limited to 'arch/mips/lib/bootm.c')
| -rw-r--r-- | arch/mips/lib/bootm.c | 98 | 
1 files changed, 93 insertions, 5 deletions
| diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c index e0722d20d1e..d9d8396e63b 100644 --- a/arch/mips/lib/bootm.c +++ b/arch/mips/lib/bootm.c @@ -7,6 +7,7 @@  #include <common.h>  #include <image.h> +#include <fdt_support.h>  #include <asm/addrspace.h>  DECLARE_GLOBAL_DATA_PTR; @@ -20,6 +21,18 @@ DECLARE_GLOBAL_DATA_PTR;  #define mips_boot_malta		0  #endif +#if defined(CONFIG_MIPS_BOOT_CMDLINE_LEGACY) +#define mips_boot_cmdline_legacy	1 +#else +#define mips_boot_cmdline_legacy	0 +#endif + +#if defined(CONFIG_MIPS_BOOT_ENV_LEGACY) +#define mips_boot_env_legacy	1 +#else +#define mips_boot_env_legacy	0 +#endif +  static int linux_argc;  static char **linux_argv;  static char *linux_argp; @@ -60,9 +73,39 @@ static int boot_setup_linux(bootm_headers_t *images)  	if (ret)  		return ret; +#if defined(CONFIG_MIPS_BOOT_FDT) && defined(CONFIG_OF_LIBFDT) +	if (images->ft_len) { +		boot_fdt_add_mem_rsv_regions(&images->lmb, images->ft_addr); + +		ret = boot_relocate_fdt(&images->lmb, &images->ft_addr, +			&images->ft_len); +		if (ret) +			return ret; +	} +#endif +  	return 0;  } +static void boot_setup_fdt(bootm_headers_t *images) +{ +#if defined(CONFIG_MIPS_BOOT_FDT) && defined(CONFIG_OF_LIBFDT) +	u64 mem_start = 0; +	u64 mem_size = gd->ram_size; + +	debug("## setup FDT\n"); + +	fdt_chosen(images->ft_addr, 1); +	fdt_fixup_memory_banks(images->ft_addr, &mem_start, &mem_size, 1); +	fdt_fixup_ethernet(images->ft_addr); +	fdt_initrd(images->ft_addr, images->initrd_start, images->initrd_end, 1); + +#if defined(CONFIG_OF_BOARD_SETUP) +	ft_board_setup(images->ft_addr, gd->bd); +#endif +#endif +} +  static void linux_cmdline_init(void)  {  	linux_argc = 1; @@ -92,7 +135,7 @@ static void linux_cmdline_dump(void)  		debug("   arg %03d: %s\n", i, linux_argv[i]);  } -static void boot_cmdline_linux(bootm_headers_t *images) +static void linux_cmdline_legacy(bootm_headers_t *images)  {  	const char *bootargs, *next, *quote; @@ -130,8 +173,40 @@ static void boot_cmdline_linux(bootm_headers_t *images)  		bootargs = next;  	} +} -	linux_cmdline_dump(); +static void linux_cmdline_append(bootm_headers_t *images) +{ +	char buf[24]; +	ulong mem, rd_start, rd_size; + +	/* append mem */ +	mem = gd->ram_size >> 20; +	sprintf(buf, "mem=%luM", mem); +	linux_cmdline_set(buf, strlen(buf)); + +	/* append rd_start and rd_size */ +	rd_start = images->initrd_start; +	rd_size = images->initrd_end - images->initrd_start; + +	if (rd_size) { +		sprintf(buf, "rd_start=0x%08lX", rd_start); +		linux_cmdline_set(buf, strlen(buf)); +		sprintf(buf, "rd_size=0x%lX", rd_size); +		linux_cmdline_set(buf, strlen(buf)); +	} +} + +static void boot_cmdline_linux(bootm_headers_t *images) +{ +	if (mips_boot_cmdline_legacy && !images->ft_len) { +		linux_cmdline_legacy(images); + +		if (!mips_boot_env_legacy) +			linux_cmdline_append(images); + +		linux_cmdline_dump(); +	}  }  static void linux_env_init(void) @@ -165,7 +240,7 @@ static void linux_env_set(const char *env_name, const char *env_val)  	}  } -static void boot_prep_linux(bootm_headers_t *images) +static void linux_env_legacy(bootm_headers_t *images)  {  	char env_buf[12];  	const char *cp; @@ -213,6 +288,15 @@ static void boot_prep_linux(bootm_headers_t *images)  	}  } +static void boot_prep_linux(bootm_headers_t *images) +{ +	if (mips_boot_env_legacy && !images->ft_len) +		linux_env_legacy(images); + +	if (images->ft_len) +		boot_setup_fdt(images); +} +  static void boot_jump_linux(bootm_headers_t *images)  {  	typedef void __noreturn (*kernel_entry_t)(int, ulong, ulong, ulong); @@ -226,8 +310,12 @@ static void boot_jump_linux(bootm_headers_t *images)  	if (mips_boot_malta)  		linux_extra = gd->ram_size; -	/* we assume that the kernel is in place */ -	printf("\nStarting kernel ...\n\n"); +#ifdef CONFIG_BOOTSTAGE_FDT +	bootstage_fdt_add_report(); +#endif +#ifdef CONFIG_BOOTSTAGE_REPORT +	bootstage_report(); +#endif  	kernel(linux_argc, (ulong)linux_argv, (ulong)linux_env, linux_extra);  } | 
