microblaze: Final support for statically linked DTB
[pandora-kernel.git] / arch / microblaze / kernel / setup.c
index eb6b417..59a3836 100644 (file)
@@ -42,10 +42,6 @@ char cmd_line[COMMAND_LINE_SIZE];
 
 void __init setup_arch(char **cmdline_p)
 {
-#ifdef CONFIG_CMDLINE_FORCE
-       strlcpy(cmd_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
-       strlcpy(boot_command_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
-#endif
        *cmdline_p = cmd_line;
 
        console_verbose();
@@ -102,14 +98,34 @@ void __init machine_early_init(const char *cmdline, unsigned int ram,
 {
        unsigned long *src, *dst = (unsigned long *)0x0;
 
+       /* If CONFIG_MTD_UCLINUX is defined, assume ROMFS is at the
+        * end of kernel. There are two position which we want to check.
+        * The first is __init_end and the second __bss_start.
+        */
+#ifdef CONFIG_MTD_UCLINUX
+       int romfs_size;
+       unsigned int romfs_base;
+       char *old_klimit = klimit;
+
+       romfs_base = (ram ? ram : (unsigned int)&__init_end);
+       romfs_size = PAGE_ALIGN(get_romfs_len((unsigned *)romfs_base));
+       if (!romfs_size) {
+               romfs_base = (unsigned int)&__bss_start;
+               romfs_size = PAGE_ALIGN(get_romfs_len((unsigned *)romfs_base));
+       }
+
+       /* Move ROMFS out of BSS before clearing it */
+       if (romfs_size > 0) {
+               memmove(&_ebss, (int *)romfs_base, romfs_size);
+               klimit += romfs_size;
+       }
+#endif
+
 /* clearing bss section */
        memset(__bss_start, 0, __bss_stop-__bss_start);
        memset(_ssbss, 0, _esbss-_ssbss);
 
-       /*
-        * Copy command line passed from bootloader, or use default
-        * if none provided, or forced
-        */
+       /* Copy command line passed from bootloader */
 #ifndef CONFIG_CMDLINE_BOOL
        if (cmdline && cmdline[0] != '\0')
                strlcpy(cmd_line, cmdline, COMMAND_LINE_SIZE);
@@ -123,30 +139,19 @@ void __init machine_early_init(const char *cmdline, unsigned int ram,
 #endif
 
        early_printk("Ramdisk addr 0x%08x, FDT 0x%08x\n", ram, fdt);
-       printk(KERN_NOTICE "Found FDT at 0x%08x\n", fdt);
+       if(fdt)
+               printk(KERN_NOTICE "Found FDT at 0x%08x\n", fdt);
 
 #ifdef CONFIG_MTD_UCLINUX
-       {
-               int size;
-               unsigned int romfs_base;
-               romfs_base = (ram ? ram : (unsigned int)&__init_end);
-               /* if CONFIG_MTD_UCLINUX_EBSS is defined, assume ROMFS is at the
-                * end of kernel, which is ROMFS_LOCATION defined above. */
-               size = PAGE_ALIGN(get_romfs_len((unsigned *)romfs_base));
-               early_printk("Found romfs @ 0x%08x (0x%08x)\n",
-                               romfs_base, size);
-               early_printk("#### klimit %p ####\n", klimit);
-               BUG_ON(size < 0); /* What else can we do? */
-
-               /* Use memmove to handle likely case of memory overlap */
-               early_printk("Moving 0x%08x bytes from 0x%08x to 0x%08x\n",
-                       size, romfs_base, (unsigned)&_ebss);
-               memmove(&_ebss, (int *)romfs_base, size);
-
-               /* update klimit */
-               klimit += PAGE_ALIGN(size);
-               early_printk("New klimit: 0x%08x\n", (unsigned)klimit);
-       }
+       early_printk("Found romfs @ 0x%08x (0x%08x)\n",
+                       romfs_base, romfs_size);
+       early_printk("#### klimit %p ####\n", old_klimit);
+       BUG_ON(romfs_size < 0); /* What else can we do? */
+
+       early_printk("Moved 0x%08x bytes from 0x%08x to 0x%08x\n",
+                       romfs_size, romfs_base, (unsigned)&_ebss);
+
+       early_printk("New klimit: 0x%08x\n", (unsigned)klimit);
 #endif
 
        for (src = __ivt_start; src < __ivt_end; src++, dst++)