Merge branch 'next' of git://git.denx.de/u-boot-avr32
[platform/kernel/u-boot.git] / common / cmd_bootm.c
index 44f6b9f..0b14b06 100644 (file)
 #include <lmb.h>
 #include <asm/byteorder.h>
 
+#if defined(CONFIG_CMD_USB)
+#include <usb.h>
+#endif
+
 #ifdef CFG_HUSH_PARSER
 #include <hush.h>
 #endif
@@ -127,13 +131,13 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        ulong           os_data, os_len;
        ulong           image_start, image_end;
        ulong           load_start, load_end;
-       ulong           mem_start, mem_size;
+       ulong           mem_start;
+       phys_size_t     mem_size;
 
        struct lmb lmb;
 
        memset ((void *)&images, 0, sizeof (images));
        images.verify = getenv_yesno ("verify");
-       images.autostart = getenv_yesno ("autostart");
        images.lmb = &lmb;
 
        lmb_init(&lmb);
@@ -141,7 +145,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        mem_start = getenv_bootm_low();
        mem_size = getenv_bootm_size();
 
-       lmb_add(&lmb, mem_start, mem_size);
+       lmb_add(&lmb, (phys_addr_t)mem_start, mem_size);
 
        board_lmb_reserve(&lmb);
 
@@ -212,14 +216,26 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
         */
        iflag = disable_interrupts();
 
+#if defined(CONFIG_CMD_USB)
+       /*
+        * turn off USB to prevent the host controller from writing to the
+        * SDRAM while Linux is booting. This could happen (at least for OHCI
+        * controller), because the HCCA (Host Controller Communication Area)
+        * lies within the SDRAM and the host controller writes continously to
+        * this area (as busmaster!). The HccaFrameNumber is for example
+        * updated every 1 ms within the HCCA structure in SDRAM! For more
+        * details see the OpenHCI specification.
+        */
+       usb_stop();
+#endif
+
+
 #ifdef CONFIG_AMIGAONEG3SE
        /*
         * We've possible left the caches enabled during
         * bios emulation, so turn them off again
         */
        icache_disable();
-       invalidate_l1_instruction_cache();
-       flush_data_cache();
        dcache_disable();
 #endif
 
@@ -232,10 +248,9 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
                        memmove_wd ((void *)load_start,
                                   (void *)os_data, os_len, CHUNKSZ);
-
-                       load_end = load_start + os_len;
-                       puts("OK\n");
                }
+               load_end = load_start + os_len;
+               puts("OK\n");
                break;
        case IH_COMP_GZIP:
                printf ("   Uncompressing %s ... ", type_name);
@@ -344,10 +359,9 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        show_boot_progress (-9);
 #ifdef DEBUG
        puts ("\n## Control returned to monitor - resetting...\n");
-       if (images.autostart)
-               do_reset (cmdtp, flag, argc, argv);
+       do_reset (cmdtp, flag, argc, argv);
 #endif
-       if (!images.autostart && iflag)
+       if (iflag)
                enable_interrupts();
 
        return 1;
@@ -433,17 +447,6 @@ static int fit_check_kernel (const void *fit, int os_noffset, int verify)
        }
        show_boot_progress (105);
 
-#ifdef CONFIG_LOGBUFFER
-#ifndef CONFIG_ALT_LB_ADDR
-       kbd=gd->bd;
-       /* Prevent initrd from overwriting logbuffer */
-       if (initrd_high < (kbd->bi_memsize-LOGBUFF_LEN-LOGBUFF_OVERHEAD))
-               initrd_high = kbd->bi_memsize-LOGBUFF_LEN-LOGBUFF_OVERHEAD;
-       debug ("## Logbuffer at 0x%08lX ", kbd->bi_memsize-LOGBUFF_LEN);
-#else
-       debug ("## Logbuffer at 0x%08lX ", CONFIG_ALT_LB_ADDR);
-#endif
-#endif
        if (!fit_image_check_target_arch (fit, os_noffset)) {
                puts ("Unsupported Architecture\n");
                show_boot_progress (-105);
@@ -623,7 +626,7 @@ static void *boot_get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]
                return NULL;
        }
 
-       debug ("   kernel data at 0x%08lx, len = 0x%08lx (%d)\n",
+       debug ("   kernel data at 0x%08lx, len = 0x%08lx (%ld)\n",
                        *os_data, *os_len, *os_len);
 
        return (void *)img_addr;