From 76c944a48db13c29007e1a39a0e1631cc2d4fa4e Mon Sep 17 00:00:00 2001 From: Antonio Nino Diaz Date: Sun, 15 Jul 2018 12:32:32 +0100 Subject: [PATCH] rpi3: Add support for direct Linux kernel boot This option allows the Trusted Firmware to pass the correct arguments to a 32 or 64-bit Linux kernel without the need of an intermediate loader such as U-Boot. Change-Id: I2b22e8933fad6a614588ace559f893e97329801f Signed-off-by: Antonio Nino Diaz --- plat/rpi3/platform.mk | 11 +++++++++++ plat/rpi3/rpi3_bl31_setup.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/plat/rpi3/platform.mk b/plat/rpi3/platform.mk index 2f18af6a8..4276c84f8 100644 --- a/plat/rpi3/platform.mk +++ b/plat/rpi3/platform.mk @@ -114,6 +114,9 @@ MULTI_CONSOLE_API := 1 # BL33 images are in AArch64 by default RPI3_BL33_IN_AARCH32 := 0 +# Assume that BL33 isn't the Linux kernel by default +RPI3_DIRECT_LINUX_BOOT := 0 + # BL32 location RPI3_BL32_RAM_LOCATION := tdram ifeq (${RPI3_BL32_RAM_LOCATION}, tsram) @@ -129,9 +132,17 @@ endif $(eval $(call add_define,RPI3_BL32_RAM_LOCATION_ID)) $(eval $(call add_define,RPI3_BL33_IN_AARCH32)) +$(eval $(call add_define,RPI3_DIRECT_LINUX_BOOT)) +$(eval $(call add_define,RPI3_PRELOADED_DTB_BASE)) # Verify build config # ------------------- +# +ifneq (${RPI3_DIRECT_LINUX_BOOT}, 0) + ifndef RPI3_PRELOADED_DTB_BASE + $(error Error: RPI3_PRELOADED_DTB_BASE needed if RPI3_DIRECT_LINUX_BOOT=1) + endif +endif ifneq (${LOAD_IMAGE_V2}, 1) $(error Error: rpi3 needs LOAD_IMAGE_V2=1) diff --git a/plat/rpi3/rpi3_bl31_setup.c b/plat/rpi3/rpi3_bl31_setup.c index 4ea1bcf90..5bbb13c86 100644 --- a/plat/rpi3/rpi3_bl31_setup.c +++ b/plat/rpi3/rpi3_bl31_setup.c @@ -96,6 +96,34 @@ void bl31_early_platform_setup(void *from_bl2, if (bl33_image_ep_info.pc == 0) { panic(); } + +#if RPI3_DIRECT_LINUX_BOOT +# if RPI3_BL33_IN_AARCH32 + /* + * According to the file ``Documentation/arm/Booting`` of the Linux + * kernel tree, Linux expects: + * r0 = 0 + * r1 = machine type number, optional in DT-only platforms (~0 if so) + * r2 = Physical address of the device tree blob + */ + VERBOSE("rpi3: Preparing to boot 32-bit Linux kernel\n"); + bl33_image_ep_info.args.arg0 = 0U; + bl33_image_ep_info.args.arg1 = ~0U; + bl33_image_ep_info.args.arg2 = (u_register_t) RPI3_PRELOADED_DTB_BASE; +# else + /* + * According to the file ``Documentation/arm64/booting.txt`` of the + * Linux kernel tree, Linux expects the physical address of the device + * tree blob (DTB) in x0, while x1-x3 are reserved for future use and + * must be 0. + */ + VERBOSE("rpi3: Preparing to boot 64-bit Linux kernel\n"); + bl33_image_ep_info.args.arg0 = (u_register_t) RPI3_PRELOADED_DTB_BASE; + bl33_image_ep_info.args.arg1 = 0ULL; + bl33_image_ep_info.args.arg2 = 0ULL; + bl33_image_ep_info.args.arg3 = 0ULL; +# endif /* RPI3_BL33_IN_AARCH32 */ +#endif /* RPI3_DIRECT_LINUX_BOOT */ } void bl31_plat_arch_setup(void)