[U-Boot] [PATCH 2/2] splash: Load internal and external data from FIT
Simon Glass
sjg at chromium.org
Sat Feb 2 06:06:24 UTC 2019
Hi Mark,
On Fri, 1 Feb 2019 at 06:31, Mark Jonas <mark.jonas at de.bosch.com> wrote:
>
> From: Leo Ruan <tingquan.ruan at 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 <sjg at chromium.org>, see
> common/spl_fit.c
>
> Signed-off-by: Leo Ruan <tingquan.ruan at cn.bosch.com>
> Signed-off-by: Mark Jonas <mark.jonas at de.bosch.com>
> ---
> common/splash_source.c | 56
+++++++++++++++++++++++++++++++-------------------
> 1 file changed, 35 insertions(+), 21 deletions(-)
Reviewed-by: Simon Glass <sjg at 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
More information about the U-Boot
mailing list