Hi Mark, On Fri, 1 Feb 2019 at 06:31, Mark Jonas <mark.jo...@de.bosch.com> wrote: > > From: Leo Ruan <tingquan.r...@cn.bosch.com> > > The FIT image could contain the splash data in 3 different structure: > - The splash data is embedded in FIT image (internal) > In this case, the property 'data' presents in FIT image header. And > internal information 'start' and 'end' represent the location and > size of splash data inside of FIT image. > - The splash data is external with absolute position in FIT image > This case is made by 'mkimage -p [pos]'. The splash data is stored > at the absolute position. Instead the property 'data', the properties > 'data-position' and 'data-size' are used to specify the location and > size of the splash data. > - the splash data is external with relative offset in FIT image > This case is made by 'mkimage -E'. The splash data is placed after > the FIT image header with 4 byte alignment. Instead the property > 'data', the properties 'data-offset' and 'data-size' are used to > specify the location and size of the splash data. > > Currently, the splash only support to load external data with relative > offset from FIT image. This commit make it possible to load the splash > data embedded in FIT image or the external data with absolute position > > This inspiration comes from Simon Glass <s...@chromium.org>, see > common/spl_fit.c > > Signed-off-by: Leo Ruan <tingquan.r...@cn.bosch.com> > Signed-off-by: Mark Jonas <mark.jo...@de.bosch.com> > --- > common/splash_source.c | 56 +++++++++++++++++++++++++++++++------------------- > 1 file changed, 35 insertions(+), 21 deletions(-)
Reviewed-by: Simon Glass <s...@chromium.org> nits below > > diff --git a/common/splash_source.c b/common/splash_source.c > index e1e73db..88fba7d 100644 > --- a/common/splash_source.c > +++ b/common/splash_source.c > @@ -304,8 +304,11 @@ static int splash_load_fit(struct splash_location *location, u32 bmp_load_addr) > int res; > int node_offset; > const char *splash_file; > - int splash_offset; > - int splash_size; > + const void *internal_splash_data; > + size_t internal_splash_size; > + int external_splash_addr; > + int external_splash_size; > + bool is_splash_external = false; > struct image_header *img_header; > const u32 *fit_header; > u32 fit_size; > @@ -348,29 +351,40 @@ static int splash_load_fit(struct splash_location *location, u32 bmp_load_addr) > return -ENOENT; > } > > - res = fit_image_get_data_offset(fit_header, node_offset, > - &splash_offset); > - if (res < 0) { > - printf("Failed to load splash image (err=%d)\n", res); > - return res; > + /* Extract the splash data from FIT */ > + /* 1. Test if splash is in FIT internal data. */ > + if (!fit_image_get_data(fit_header, node_offset, &internal_splash_data, &internal_splash_size)) > + memmove((void *)bmp_load_addr, internal_splash_data, internal_splash_size); > + /* 2. Test if splash is in FIT external data with fixed position. */ > + else if (!fit_image_get_data_position(fit_header, node_offset, &external_splash_addr)) > + is_splash_external = true; > + /* 3. Test if splash is in FIT external data with offset. */ > + else if (!fit_image_get_data_offset(fit_header, node_offset, &external_splash_addr)) { > + /* Align data offset to 4-byte boundrary */ > + fit_size = fdt_totalsize(fit_header); > + fit_size = (fit_size + 3) & ~3; Can you use ALIGN()? > + /* External splash offset means the offset by end of FIT header */ > + external_splash_addr += location->offset + fit_size; > + is_splash_external = true; > + } else { > + printf("Failed to get splash image from FIT\n"); > + return -ENODATA; > } > > - res = fit_image_get_data_size(fit_header, node_offset, &splash_size); > - if (res < 0) { > - printf("Failed to load splash image (err=%d)\n", res); > - return res; > + if (is_splash_external) { > + res = fit_image_get_data_size(fit_header, node_offset, &external_splash_size); > + if (res < 0) { > + printf("Failed to get size of splash image (err=%d)\n", res); > + return res; > + } > + > + /* Read in the splash data */ > + location->offset = external_splash_addr; > + res = splash_storage_read_raw(location, bmp_load_addr, external_splash_size); > + if (res < 0) > + return res; > } > > - /* Align data offset to 4-byte boundrary */ > - fit_size = fdt_totalsize(fit_header); > - fit_size = (fit_size + 3) & ~3; > - > - /* Read in the splash data */ > - location->offset = (location->offset + fit_size + splash_offset); > - res = splash_storage_read_raw(location, bmp_load_addr , splash_size); > - if (res < 0) > - return res; > - > return 0; > } > #endif /* CONFIG_FIT */ > -- > 2.7.4 > Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot