[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