Changes since U-Boot 0.3.1:
 ======================================================================
 
+* Add zero-copy ramdisk support (requires corresponding kernel support!)
+
 * Patch by Kyle Harris, 20 May 2003:
   In preparation for an ixp port, rename cpu/xscale and arch-xscale
   into cpu/pxa and arch-pxa.
 
 
                  setenv initrd_high 00c00000
 
+                  If you set initrd_high to 0xFFFFFFFF, this is an
+                  indication to U-Boot that all addresses are legal
+                  for the Linux kernel, including addresses in flash
+                  memory. In this case U-Boot will NOT COPY the
+                  ramdisk at all. This may be useful to reduce the
+                  boot time on your system, but requires that this
+                  feature is supported by your Linux kernel.
+
   ipaddr       - IP address; needed for tftpboot command
 
   loadaddr     - Default load address for commands like "bootp",
 
        ulong   cmd_start, cmd_end;
        ulong   initrd_high;
        ulong   data;
+       int     initrd_copy_to_ram = 1;
        char    *cmdline;
        char    *s;
        bd_t    *kbd;
                 * turning the "load high" feature off. This is intentional.
                 */
                initrd_high = simple_strtoul(s, NULL, 16);
+               if (initrd_high == ~0)
+                       initrd_copy_to_ram = 0;
        } else {        /* not set, no restrictions to load high */
                initrd_high = ~0;
        }
        }
 
        if (data) {
+           if (!initrd_copy_to_ram) {  /* zero-copy ramdisk support */
+               initrd_start = data;
+               initrd_end = initrd_start + len;
+           } else {
                initrd_start  = (ulong)kbd - len;
                initrd_start &= ~(4096 - 1);    /* align on page */
 
                memmove ((void *)initrd_start, (void *)data, len);
 #endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
                printf ("OK\n");
+           }
        } else {
                initrd_start = 0;
                initrd_end = 0;