Skip to content

Commit 854a5a0

Browse files
author
Marek Vasut
committed
image: Add support for starting TFA BL31 as fitImage loadables
Add support for starting TFA from U-Boot running in EL3 as part of fitImage boot, so the user can start U-Boot in the highest privilege level on the platform, bundle TFA, Linux, DT into a single fitImage and boot such a bundle as a whole. There are two main benefits of this approach. First is the ability to run U-Boot in EL3, where it has unrestricted access to the entire system and can act as a useful debug tool, as it was always intended to be used. Second is the ability to easily and safely update of any component in the fitImage, be it TFA, Linux or DT. The boot process is similar to regular Linux with DT fitImage boot process, except the TFA has to be bundled into the fitImage. For the bundling instructions, see below. The TFA is started as a 'loadables' with custom U_BOOT_FIT_LOADABLE_HANDLER and armv8_switch_to_el2_prep() handling implemented in board code, and performing the handoff and boot in case the TFA was loaded. The loadables handler is optional and meant to set up any sort of handoff structures used by the TFA BL31 or perform any other setup that is needed by the blob. The custom armv8_switch_to_el2_prep() has to implement the jump to TFA BL31 with return to U-Boot just before booting the Linux kernel. Example fitImage image and configuration section: /dts-v1/; / { description = "Linux kernel with FDT blob and TFA BL31"; images { kernel-1 { ... }; fdt-1 { ... }; atf-1 { /* This is the TFA BL31 image */ description = "TFA BL31"; data = /incbin/("../build/plat/release/bl31.bin"); type = "tfa-bl31"; arch = "arm64"; os = "arm-trusted-firmware"; compression = "none"; load = <0x46400000>; entry = <0x46400000>; }; }; configurations { default = "conf-1"; conf-1 { description = "Boot Linux"; kernel = "kernel-1"; fdt = "fdt-1"; loadables = "atf-1"; /* This is the TFA BL31 loadable */ }; }; }; Reviewed-by: Tom Rini <[email protected]> Signed-off-by: Marek Vasut <[email protected]>
1 parent 9f95282 commit 854a5a0

File tree

3 files changed

+3
-0
lines changed

3 files changed

+3
-0
lines changed

boot/image-fit.c

+1
Original file line numberDiff line numberDiff line change
@@ -2175,6 +2175,7 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
21752175
type_ok = fit_image_check_type(fit, noffset, image_type) ||
21762176
fit_image_check_type(fit, noffset, IH_TYPE_FIRMWARE) ||
21772177
fit_image_check_type(fit, noffset, IH_TYPE_TEE) ||
2178+
fit_image_check_type(fit, noffset, IH_TYPE_TFA_BL31) ||
21782179
(image_type == IH_TYPE_KERNEL &&
21792180
fit_image_check_type(fit, noffset, IH_TYPE_KERNEL_NOLOAD));
21802181

boot/image.c

+1
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ static const table_entry_t uimage_type[] = {
183183
{ IH_TYPE_FDT_LEGACY, "fdt_legacy", "legacy Image with Flat Device Tree ", },
184184
{ IH_TYPE_RENESAS_SPKG, "spkgimage", "Renesas SPKG Image" },
185185
{ IH_TYPE_STARFIVE_SPL, "sfspl", "StarFive SPL Image" },
186+
{ IH_TYPE_TFA_BL31, "tfa-bl31", "TFA BL31 Image", },
186187
{ -1, "", "", },
187188
};
188189

include/image.h

+1
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ enum image_type_t {
232232
IH_TYPE_FDT_LEGACY, /* Binary Flat Device Tree Blob in a Legacy Image */
233233
IH_TYPE_RENESAS_SPKG, /* Renesas SPKG image */
234234
IH_TYPE_STARFIVE_SPL, /* StarFive SPL image */
235+
IH_TYPE_TFA_BL31, /* TFA BL31 image */
235236

236237
IH_TYPE_COUNT, /* Number of image types */
237238
};

0 commit comments

Comments
 (0)