diff mbox series

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

Message ID 20201216000944.2832585-9-mr.nuke.me@gmail.com
State Superseded
Delegated to: Tom Rini
Headers show
Series spl: fit: Play nicely with OP-TEE and Linux | expand

Commit Message

Alexandru Gagniuc Dec. 16, 2020, 12:09 a.m. UTC
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(-)

Comments

Alexandru Gagniuc Dec. 16, 2020, 5:26 p.m. UTC | #1
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;
>   		}
>
diff mbox series

Patch

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)) {
 		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;
 		}