[U-Boot] [PATCH] common: image-fit: add FIT data-position & data-offset property support

Kelvin Cheung keguang.zhang at gmail.com
Thu May 17 02:15:51 UTC 2018


Hi Simon,
You are right.
I will update the patch soon.
Thanks very much!

2018-05-16 23:40 GMT+08:00 Simon Glass <sjg at chromium.org>:

> Hi Kevin,
>
> On 16 May 2018 at 15:35, Kelvin Cheung <keguang.zhang at gmail.com> wrote:
> > Add FIT data-position & data-offset property support for bootm,
> > which are already supported in SPL.
> >
> > Signed-off-by: Kelvin Cheung <keguang.zhang at gmail.com>
> > ---
> >
> >  common/image-fit.c | 82 ++++++++++++++++++++++++++++++
> +++++++++++++++++++++---
> >  1 file changed, 78 insertions(+), 4 deletions(-)
> >
> > diff --git a/common/image-fit.c b/common/image-fit.c
> > index 5b93dce..f21db4b 100644
> > --- a/common/image-fit.c
> > +++ b/common/image-fit.c
> > @@ -359,11 +359,14 @@ void fit_image_print(const void *fit, int
> image_noffset, const char *p)
> >  {
> >         char *desc;
> >         uint8_t type, arch, os, comp;
> > -       size_t size;
> > +       size_t size = 0;
> >         ulong load, entry;
> >         const void *data;
> >         int noffset;
> >         int ndepth;
> > +       bool external_data = false;
> > +       int offset;
> > +       int len;
> >         int ret;
> >
> >         /* Mandatory properties */
> > @@ -391,7 +394,27 @@ void fit_image_print(const void *fit, int
> image_noffset, const char *p)
> >         fit_image_get_comp(fit, image_noffset, &comp);
> >         printf("%s  Compression:  %s\n", p, genimg_get_comp_name(comp));
> >
> > -       ret = fit_image_get_data(fit, image_noffset, &data, &size);
> > +       if (!fit_image_get_data_position(fit, image_noffset, &offset)) {
> > +               external_data = true;
> > +       } else if (!fit_image_get_data_offset(fit, image_noffset,
> &offset)) {
> > +               external_data = true;
> > +               /*
> > +                * For FIT with external data, figure out where
> > +                * the external images start. This is the base
> > +                * for the data-offset properties in each image.
> > +                */
> > +               size = (fdt_totalsize(fit) + 3) & ~3;
> > +               offset += size;
> > +       }
> > +
> > +       if (external_data) {
> > +               printf("%s  External Data\n", p);
> > +               ret = fit_image_get_data_size(fit, image_noffset, &len);
> > +               data = fit + offset;
> > +               size = len;
> > +       } else {
> > +               ret = fit_image_get_data(fit, image_noffset, &data,
> &size);
> > +       }
>
> It looks like you should create which does all of the above, that can
> be called in the three places where you repeat this code.
>
> Perhaps fit_image_get_data_buf_size()?
>
> >
> >  #ifndef USE_HOSTCC
> >         printf("%s  Data Start:   ", p);
> > @@ -1151,9 +1174,35 @@ int fit_image_verify(const void *fit, int
> image_noffset)
> >         size_t          size;
> >         int             noffset = 0;
> >         char            *err_msg = "";
> > +       bool external_data = false;
> > +       int offset;
> > +       int len;
> > +       int ret;
> >
> >         /* Get image data and data length */
> > -       if (fit_image_get_data(fit, image_noffset, &data, &size)) {
> > +       if (!fit_image_get_data_position(fit, image_noffset, &offset)) {
> > +               external_data = true;
> > +       } else if (!fit_image_get_data_offset(fit, image_noffset,
> &offset)) {
> > +               external_data = true;
> > +               /*
> > +                * For FIT with external data, figure out where
> > +                * the external images start. This is the base
> > +                * for the data-offset properties in each image.
> > +                */
> > +               size = (fdt_totalsize(fit) + 3) & ~3;
> > +               offset += size;
> > +       }
> > +
> > +       if (external_data) {
> > +               debug("External Data\n");
> > +               ret = fit_image_get_data_size(fit, image_noffset, &len);
> > +               data = fit + offset;
> > +               size = len;
> > +       } else {
> > +               ret = fit_image_get_data(fit, image_noffset, &data,
> &size);
> > +       }
> > +
> > +       if (ret) {
> >                 err_msg = "Can't get image data/size";
> >                 printf("error!\n%s for '%s' hash node in '%s' image
> node\n",
> >                        err_msg, fit_get_name(fit, noffset, NULL),
> > @@ -1750,6 +1799,9 @@ int fit_image_load(bootm_headers_t *images, ulong
> addr,
> >         uint8_t os_arch;
> >  #endif
> >         const char *prop_name;
> > +       bool external_data = false;
> > +       int offset;
> > +       int data_len;
> >         int ret;
> >
> >         fit = map_sysmem(addr, 0);
> > @@ -1875,7 +1927,29 @@ int fit_image_load(bootm_headers_t *images, ulong
> addr,
> >         bootstage_mark(bootstage_id + BOOTSTAGE_SUB_CHECK_ALL_OK);
> >
> >         /* get image data address and length */
> > -       if (fit_image_get_data(fit, noffset, &buf, &size)) {
> > +       if (!fit_image_get_data_position(fit, noffset, &offset)) {
> > +               external_data = true;
> > +       } else if (!fit_image_get_data_offset(fit, noffset, &offset)) {
> > +               external_data = true;
> > +               /*
> > +                * For FIT with external data, figure out where
> > +                * the external images start. This is the base
> > +                * for the data-offset properties in each image.
> > +                */
> > +               size = (fdt_totalsize(fit) + 3) & ~3;
> > +               offset += size;
> > +       }
> > +
> > +       if (external_data) {
> > +               debug("External Data\n");
> > +               ret = fit_image_get_data_size(fit, noffset, &data_len);
> > +               buf = fit + offset;
> > +               size = data_len;
> > +       } else {
> > +               ret = fit_image_get_data(fit, noffset, &buf, &size);
> > +       }
> > +
> > +       if (ret) {
> >                 printf("Could not find %s subimage data!\n", prop_name);
> >                 bootstage_error(bootstage_id + BOOTSTAGE_SUB_GET_DATA);
> >                 return -ENOENT;
> > --
> > 1.9.1
> >
>
> Regards,
> Simon
>



-- 
Best regards,

Kelvin Cheung


More information about the U-Boot mailing list