[U-Boot] [PATCH v2 03/11] spl: fit: use U-Boot device tree when FIT image has no device tree
Anup Patel
anup at brainfault.org
Mon Jul 29 08:20:33 UTC 2019
On Sun, Jul 28, 2019 at 9:28 PM Lukas Auer
<lukas.auer at aisec.fraunhofer.de> wrote:
>
> As part of the SPL FIT boot flow, the device tree is appended to U-Boot
> proper. The device tree is used to record information on the loadables
> to make them available to the SPL framework and U-Boot proper. Depending
> on the U-Boot device tree provider, the FIT image might not include a
> device tree. Information on the loadables is missing in this case.
>
> When booting via firmware bundled with the FIT image, U-Boot SPL loads
> the firmware binary and U-Boot proper before starting the firmware. The
> firmware, in turn, is responsible for starting U-Boot proper.
> Information on the memory location of the U-Boot proper loadable must be
> available to the SPL framework so that it can be passed to the firmware
> binary. To support this use case when no device tree is found in the FIT
> image, fall back to the U-Boot device tree in this situation.
>
> At the same time, update the comment to remove the note that the
> destination address must be aligned to ARCH_DMA_MINALIGN. Alignment is
> only required as an intermediate step when reading external data. This
> is automatically handled by spl_fit_append_fdt(). After reading the
> external data, it is copied to the specified address, which does not
> have to be aligned to ARCH_DMA_MINALIGN.
>
> Signed-off-by: Lukas Auer <lukas.auer at aisec.fraunhofer.de>
> Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
> Tested-by: Bin Meng <bmeng.cn at gmail.com>
> ---
>
> Changes in v2: None
>
> common/spl/spl_fit.c | 37 ++++++++++++++++++++++++-------------
> 1 file changed, 24 insertions(+), 13 deletions(-)
>
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index 969f7775c1..0bfb91d686 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -11,6 +11,8 @@
> #include <linux/libfdt.h>
> #include <spl.h>
>
> +DECLARE_GLOBAL_DATA_PTR;
> +
> #ifndef CONFIG_SYS_BOOTM_LEN
> #define CONFIG_SYS_BOOTM_LEN (64 << 20)
> #endif
> @@ -278,25 +280,34 @@ static int spl_fit_append_fdt(struct spl_image_info *spl_image,
> void *fit, int images, ulong base_offset)
> {
> struct spl_image_info image_info;
> - int node, ret;
> + int node, ret = 0;
> +
> + /*
> + * Use the address following the image as target address for the
> + * device tree.
> + */
> + image_info.load_addr = spl_image->load_addr + spl_image->size;
>
> /* Figure out which device tree the board wants to use */
> node = spl_fit_get_image_node(fit, images, FIT_FDT_PROP, 0);
> if (node < 0) {
> debug("%s: cannot find FDT node\n", __func__);
> - return node;
> - }
> -
> - /*
> - * Read the device tree and place it after the image.
> - * Align the destination address to ARCH_DMA_MINALIGN.
> - */
> - image_info.load_addr = spl_image->load_addr + spl_image->size;
> - ret = spl_load_fit_image(info, sector, fit, base_offset, node,
> - &image_info);
>
> - if (ret < 0)
> - return ret;
> + /*
> + * U-Boot did not find a device tree inside the FIT image. Use
> + * the U-Boot device tree instead.
> + */
> + if (gd->fdt_blob)
> + memcpy((void *)image_info.load_addr, gd->fdt_blob,
> + fdt_totalsize(gd->fdt_blob));
> + else
> + return node;
> + } else {
> + ret = spl_load_fit_image(info, sector, fit, base_offset, node,
> + &image_info);
> + if (ret < 0)
> + return ret;
> + }
>
> /* Make the load-address of the FDT available for the SPL framework */
> spl_image->fdt_addr = (void *)image_info.load_addr;
> --
> 2.21.0
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
Reviewed-by: Anup Patel <anup.patel at wdc.com>
Regards,
Anup
More information about the U-Boot
mailing list