[PATCH 8/8] spl: fit: Load devicetree when a Linux payload is found

Alex G.
2020-12-16T17:26:56Z

On 12/15/20 6:09 PM, Alexandru Gagniuc wrote:
> When a FIT config specifies a devicetree, we should load it, no
> questions asked. In the case of the "simple" FIT loading path, a
> difficulty arises in selecting the load address of the FDT.
>
> The default FDT location is right after the "kernel" or "firmware"
> image. However, if that is an OP-TEE image, then the FDT may end up in
> secure DRAM, and not be accessible to normal world kernels.
>
> Although the best solution is to be more careful about the FDT
> address, a viable workaround is to only append the FDT after a u-boot
> or Linux image. This is identical to the previous logic, except that
> FDT loading is extended to IH_OS_LINUX images.
>
> Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
> ---
> common/spl/spl_fit.c | 18 +++++++++++++++---
> 1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index ebfd5fa112..e64fde9e86 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -335,6 +335,18 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
> return 0;
> }
>
> +static bool os_takes_devicetree(uint8_t os)
> +{
> + switch (os) {
> + case IH_OS_U_BOOT:
> + return true;
> + case IH_OS_LINUX:
> + return IS_ENABLED(CONFIG_SPL_OS_BOOT);
> + default:
> + return false;
> + }
> +}
> +
> static int spl_fit_append_fdt(struct spl_image_info *spl_image,
> struct spl_load_info *info, ulong sector,
> const struct spl_fit_info *ctx)
> @@ -664,9 +676,9 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
> * Booting a next-stage U-Boot may require us to append the FDT.
> * We allow this to fail, as the U-Boot image might embed its FDT.
> */
> - if (spl_image->os == IH_OS_U_BOOT) {
> + if (os_takes_devicetree(spl_image->os)) {

The if clause here should say "if (os_takes_devicetree(os_type)) {". I
will fix this in v2.

> ret = spl_fit_append_fdt(spl_image, info, sector, &ctx);
> - if (!IS_ENABLED(CONFIG_OF_EMBED) && ret < 0)
> + if (ret < 0 && spl_image->os != IH_OS_U_BOOT)
> return ret;
> }
>
> @@ -694,7 +706,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
> if (!spl_fit_image_get_os(ctx.fit, node, &os_type))
> debug("Loadable is %s\n", genimg_get_os_name(os_type));
>
> - if (os_type == IH_OS_U_BOOT) {
> + if (os_takes_devicetree(spl_image->os)) {
> spl_fit_append_fdt(&image_info, info, sector, &ctx);
> spl_image->fdt_addr = image_info.fdt_addr;
> }
>