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

Alex G. mr.nuke.me at gmail.com
Wed Dec 16 18:26:56 CET 2020



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 at 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;
>   		}
> 


More information about the U-Boot mailing list