diff mbox series

[U-Boot,V3,2/2] bootm: Handle kernel_noload on arm64

Message ID 20180604180955.30850-2-marek.vasut+renesas@gmail.com
State Superseded
Delegated to: Tom Rini
Headers show
Series [U-Boot,V3,1/2] ARM: image: Add option for ignoring ep bit 3 | expand

Commit Message

Marek Vasut June 4, 2018, 6:09 p.m. UTC
The ARM64 has 2 MiB alignment requirement for the kernel. When using
fitImage, this requirement may by violated, the kernel will thus be
executed from unaligned address and fail to boot. Do what booti does
and run booti_setup() for kernel_noload images on arm64 to obtain a
suitable aligned address to which the image shall be relocated.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Bin Chen <bin.chen@linaro.org>
Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Tom Rini <trini@konsulko.com>
---
V2: Protect the ARM64 booti bit with if IS_ENABLED(CMD_BOOTI)
V3: Use if() instead of #ifdef
---
 common/bootm.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/common/bootm.c b/common/bootm.c
index e789f6818a..fad8480a7a 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -202,8 +202,23 @@  static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc,
 	}
 
 	if (images.os.type == IH_TYPE_KERNEL_NOLOAD) {
-		images.os.load = images.os.image_start;
-		images.ep += images.os.load;
+		if (CONFIG_IS_ENABLED(CMD_BOOTI) &&
+		    images.os.arch == IH_ARCH_ARM64) {
+			ulong image_addr;
+			ulong image_size;
+
+			ret = booti_setup(images.os.image_start, &image_addr,
+					  &image_size, 1);
+			if (ret != 0)
+				return 1;
+
+			images.os.type = IH_TYPE_KERNEL;
+			images.os.load = image_addr;
+			images.ep = image_addr;
+		} else {
+			images.os.load = images.os.image_start;
+			images.ep += images.os.image_start;
+		}
 	}
 
 	images.os.start = map_to_sysmem(os_hdr);