Add zero-copy ramdisk support (requires corresponding kernel support!)
diff --git a/CHANGELOG b/CHANGELOG
index 733a1d3..10ae064 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,8 @@
 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.
diff --git a/README b/README
index 4dfb292..ecc087a 100644
--- a/README
+++ b/README
@@ -1988,6 +1988,14 @@
 
 		  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",
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index fa32d46..af62bec 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -374,6 +374,7 @@
 	ulong	cmd_start, cmd_end;
 	ulong	initrd_high;
 	ulong	data;
+	int	initrd_copy_to_ram = 1;
 	char    *cmdline;
 	char	*s;
 	bd_t	*kbd;
@@ -385,6 +386,8 @@
 		 * 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;
 	}
@@ -567,6 +570,10 @@
 	}
 
 	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 */
 
@@ -621,6 +628,7 @@
 		memmove ((void *)initrd_start, (void *)data, len);
 #endif	/* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
 		printf ("OK\n");
+	    }
 	} else {
 		initrd_start = 0;
 		initrd_end = 0;