[U-Boot] [PATCH RFC] common/image: Allow initrd_high & fdt_high to have special case no_reloc

Tuomas Tynkkynen tuomas at tuxera.com
Wed Jan 18 01:50:28 CET 2017


The documented way of disabling relocation of the initrd or FDT is
setting initrd_high or fdt_high to 0xffffffff.
However, that is actually wrong on 64-bit platforms, where
0xffffffffffffffff needs to be used. This is somewhat painful:

 - Some platforms (e.g. Raspberry Pi) have a common file setting fdt_high
   or initrd_high to 0xffffffff that is included in both 32-bit builds
   (RPi 1, 2) and 64-bit builds (RPi 3). Those are currently not doing
   the right thing in 64-bit builds, and it wouldn't be nice to #ifdef
   around that.
 - Typing the 16 consecutive f's in 0xffffffffffffffff is not very
   pleasant.

To fix these, make the initrd_high and fdt_high handling accept a special
value "no_reloc" that does the right thing independent of the bitness.
The old values keep working for compatibility.

Signed-off-by: Tuomas Tynkkynen <tuomas at tuxera.com>
---
Only compile-tested so far.

 README             | 18 +++++++++++-------
 common/image-fdt.c |  2 +-
 common/image.c     |  2 +-
 3 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/README b/README
index 7e0dd35f93..e5e10e46ca 100644
--- a/README
+++ b/README
@@ -4940,12 +4940,14 @@ List of environment variables (most likely not complete):
 		  of the 704 MB low memory, so that Linux kernel can
 		  access it during the boot procedure.
 
-		  If this is set to the special value 0xFFFFFFFF then
-		  the fdt will not be copied at all on boot.  For this
-		  to work it must reside in writable memory, have
-		  sufficient padding on the end of it for u-boot to
-		  add the information it needs into it, and the memory
-		  must be accessible by the kernel.
+		  If this is set to "no_reloc" or to the largest
+		  possible address (0xFFFFFFFF on 32-bit platforms,
+		  0xFFFFFFFFFFFFFFFF on 64-bit platforms), the fdt
+		  will not be copied at all on boot.  For this to work
+		  it must reside in writable memory, have sufficient
+		  padding on the end of it for u-boot to add the
+		  information it needs into it, and the memory must
+		  be accessible by the kernel.
 
   fdtcontroladdr- if set this is the address of the control flattened
 		  device tree used by U-Boot when CONFIG_OF_CONTROL is
@@ -4978,7 +4980,9 @@ List of environment variables (most likely not complete):
 
 		  setenv initrd_high 00c00000
 
-		  If you set initrd_high to 0xFFFFFFFF, this is an
+		  If you set initrd_high to "no_reloc" or to the largest
+		  possible address (0xFFFFFFFF on 32-bit platforms,
+		  0xFFFFFFFFFFFFFFFF on 64-bit platforms), 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
diff --git a/common/image-fdt.c b/common/image-fdt.c
index e7540be8d6..3e3113b51c 100644
--- a/common/image-fdt.c
+++ b/common/image-fdt.c
@@ -136,7 +136,7 @@ int boot_relocate_fdt(struct lmb *lmb, char **of_flat_tree, ulong *of_size)
 	if (fdt_high) {
 		void *desired_addr = (void *)simple_strtoul(fdt_high, NULL, 16);
 
-		if (((ulong) desired_addr) == ~0UL) {
+		if (((ulong) desired_addr) == ~0UL || !strcmp(fdt_high, "no_reloc")) {
 			/* All ones means use fdt in place */
 			of_start = fdt_blob;
 			lmb_reserve(lmb, (ulong)of_start, of_len);
diff --git a/common/image.c b/common/image.c
index 8c35327745..35c67856c5 100644
--- a/common/image.c
+++ b/common/image.c
@@ -1229,7 +1229,7 @@ int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
 		 * turning the "load high" feature off. This is intentional.
 		 */
 		initrd_high = simple_strtoul(s, NULL, 16);
-		if (initrd_high == ~0)
+		if (initrd_high == ~0 || !strcmp(s, "no_reloc"))
 			initrd_copy_to_ram = 0;
 	} else {
 		initrd_high = getenv_bootm_mapsize() + getenv_bootm_low();
-- 
2.11.0



More information about the U-Boot mailing list