+
+static void boot_prep_linux(bootm_headers_t *images)
+{
+ char env_buf[12];
+ const char *cp;
+ ulong rd_start, rd_size;
+
+#ifdef CONFIG_MEMSIZE_IN_BYTES
+ sprintf(env_buf, "%lu", (ulong)gd->ram_size);
+ debug("## Giving linux memsize in bytes, %lu\n", (ulong)gd->ram_size);
+#else
+ sprintf(env_buf, "%lu", (ulong)(gd->ram_size >> 20));
+ debug("## Giving linux memsize in MB, %lu\n",
+ (ulong)(gd->ram_size >> 20));
+#endif /* CONFIG_MEMSIZE_IN_BYTES */
+
+ rd_start = UNCACHED_SDRAM(images->initrd_start);
+ rd_size = images->initrd_end - images->initrd_start;
+
+ linux_env_init();
+
+ linux_env_set("memsize", env_buf);
+
+ sprintf(env_buf, "0x%08lX", rd_start);
+ linux_env_set("initrd_start", env_buf);
+
+ sprintf(env_buf, "0x%lX", rd_size);
+ linux_env_set("initrd_size", env_buf);
+
+ sprintf(env_buf, "0x%08X", (uint) (gd->bd->bi_flashstart));
+ linux_env_set("flash_start", env_buf);
+
+ sprintf(env_buf, "0x%X", (uint) (gd->bd->bi_flashsize));
+ linux_env_set("flash_size", env_buf);
+
+ cp = getenv("ethaddr");
+ if (cp)
+ linux_env_set("ethaddr", cp);
+
+ cp = getenv("eth1addr");
+ if (cp)
+ linux_env_set("eth1addr", cp);
+
+ if (mips_boot_malta) {
+ sprintf(env_buf, "%un8r", gd->baudrate);
+ linux_env_set("modetty0", env_buf);
+ }
+}
+
+static void boot_jump_linux(bootm_headers_t *images)
+{
+ typedef void __noreturn (*kernel_entry_t)(int, ulong, ulong, ulong);
+ kernel_entry_t kernel = (kernel_entry_t) images->ep;
+ ulong linux_extra = 0;
+
+ debug("## Transferring control to Linux (at address %p) ...\n", kernel);
+
+ bootstage_mark(BOOTSTAGE_ID_RUN_OS);
+
+ if (mips_boot_malta)
+ linux_extra = gd->ram_size;
+
+ /* we assume that the kernel is in place */
+ printf("\nStarting kernel ...\n\n");
+
+ kernel(linux_argc, (ulong)linux_argv, (ulong)linux_env, linux_extra);
+}
+
+int do_bootm_linux(int flag, int argc, char * const argv[],
+ bootm_headers_t *images)
+{
+ /* No need for those on MIPS */
+ if (flag & BOOTM_STATE_OS_BD_T)
+ return -1;
+
+ if (flag & BOOTM_STATE_OS_CMDLINE) {
+ boot_cmdline_linux(images);
+ return 0;
+ }
+
+ if (flag & BOOTM_STATE_OS_PREP) {
+ boot_prep_linux(images);
+ return 0;
+ }
+
+ if (flag & BOOTM_STATE_OS_GO) {
+ boot_jump_linux(images);
+ return 0;
+ }
+
+ boot_cmdline_linux(images);
+ boot_prep_linux(images);
+ boot_jump_linux(images);
+
+ /* does not return */
+ return 1;
+}