Message ID | 20190728155723.3412-4-lukas.auer@aisec.fraunhofer.de |
---|---|
State | Superseded |
Delegated to: | Andes |
Headers | show |
Series | SPL support for RISC-V | expand |
On Sun, Jul 28, 2019 at 9:28 PM Lukas Auer <lukas.auer@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@aisec.fraunhofer.de> > Reviewed-by: Bin Meng <bmeng.cn@gmail.com> > Tested-by: Bin Meng <bmeng.cn@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@lists.denx.de > https://lists.denx.de/listinfo/u-boot Reviewed-by: Anup Patel <anup.patel@wdc.com> Regards, Anup
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;