Re: [U-Boot] [PATCH v3 1/2] spl: Add an option to load a FIT containing U-Boot from FS
+ Michal Hi Simon, On Wednesday 20 April 2016 08:11 PM, Simon Glass wrote: > On 13 April 2016 at 23:15, Lokesh Vutlawrote: >> This provides a way to load a FIT containing U-Boot and a selection of device >> tree files from a File system. >> >> Signed-off-by: Lokesh Vutla >> --- >> Changes since v2: >> - Fixed the number of bytes being copied. >> >> common/spl/spl_fit.c | 148 >> +++ >> include/spl.h| 31 +++ >> 2 files changed, 156 insertions(+), 23 deletions(-) >> >> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c >> index 1a5c027..f5d47c5 100644 >> --- a/common/spl/spl_fit.c >> +++ b/common/spl/spl_fit.c >> @@ -82,12 +82,42 @@ static int spl_fit_select_fdt(const void *fdt, int >> images, int *fdt_offsetp) >> return -ENOENT; >> } >> >> +#define get_fit_size(fit) ALIGN(fdt_totalsize(fit), 4) >> + >> +static int spl_parse_fit_header(void *fit) >> +{ >> + int node; >> + >> + spl_image.images = fdt_path_offset(fit, FIT_IMAGES_PATH); >> + if (spl_image.images < 0) { >> + debug("%s: Cannot find /images node: %d\n", __func__, >> + spl_image.images); >> + return -1; >> + } >> + node = fdt_first_subnode(fit, spl_image.images); >> + if (node < 0) { >> + debug("%s: Cannot find first image node: %d\n", __func__, >> node); >> + return -1; >> + } >> + >> + /* Get its information and set up the spl_image structure */ >> + spl_image.data_offset = fdt_getprop_u32(fit, node, "data-offset"); >> + spl_image.data_size = fdt_getprop_u32(fit, node, "data-size"); >> + spl_image.load_addr = fdt_getprop_u32(fit, node, "load"); >> + debug("data_offset=%x, data_size=%x\n", spl_image.data_offset, >> + spl_image.data_size); >> + spl_image.entry_point = spl_image.load_addr; >> + spl_image.os = IH_OS_U_BOOT; >> + >> + return 0; >> +} >> + >> int spl_load_simple_fit(struct spl_load_info *info, ulong sector, void *fit) >> { >> int sectors; >> ulong size, load; >> unsigned long count; >> - int node, images; >> + int images, ret; >> void *load_ptr; >> int fdt_offset, fdt_len; >> int data_offset, data_size; >> @@ -99,9 +129,8 @@ int spl_load_simple_fit(struct spl_load_info *info, ulong >> sector, void *fit) >> * Figure out where the external images start. This is the base for >> the >> * data-offset properties in each image. >> */ >> - size = fdt_totalsize(fit); >> - size = (size + 3) & ~3; >> - base_offset = (size + 3) & ~3; >> + size = get_fit_size(fit); >> + base_offset = size; >> >> /* >> * So far we only have one block of data from the FIT. Read the >> entire >> @@ -125,26 +154,13 @@ int spl_load_simple_fit(struct spl_load_info *info, >> ulong sector, void *fit) >> if (count == 0) >> return -EIO; >> >> - /* find the firmware image to load */ >> - images = fdt_path_offset(fit, FIT_IMAGES_PATH); >> - if (images < 0) { >> - debug("%s: Cannot find /images node: %d\n", __func__, >> images); >> + ret = spl_parse_fit_header(fit); >> + if (ret < 0) >> return -1; >> - } >> - node = fdt_first_subnode(fit, images); >> - if (node < 0) { >> - debug("%s: Cannot find first image node: %d\n", __func__, >> node); >> - return -1; >> - } >> - >> - /* Get its information and set up the spl_image structure */ >> - data_offset = fdt_getprop_u32(fit, node, "data-offset"); >> - data_size = fdt_getprop_u32(fit, node, "data-size"); >> - load = fdt_getprop_u32(fit, node, "load"); >> - debug("data_offset=%x, data_size=%x\n", data_offset, data_size); >> - spl_image.load_addr = load; >> - spl_image.entry_point = load; >> - spl_image.os = IH_OS_U_BOOT; >> + data_offset = spl_image.data_offset; >> + data_size = spl_image.data_size; >> + load = spl_image.load_addr; >> + images = spl_image.images; >> >> /* >> * Work out where to place the image. We read it so that the first >> @@ -192,3 +208,89 @@ int spl_load_simple_fit(struct spl_load_info *info, >> ulong sector, void *fit) >> >> return 0; >> } >> + >> +int spl_fs_load_simple_fit(struct spl_load_info *info, const char *filename, >> + void *fit) >> +{ >> + ulong size, load; >> + unsigned long count; >> + int images, ret; >> + void *load_ptr; >> + int fdt_offset, fdt_len; >> + int data_offset, data_size, file_offset; >> + int base_offset = 0, align_len; >> + void *dst; >> + >> + /* >> +* Figure out where the external images start. This is the base for >> the
Re: [U-Boot] [PATCH v3 1/2] spl: Add an option to load a FIT containing U-Boot from FS
Hi, 2016-04-20 16:41 GMT+02:00 Simon Glass: > On 13 April 2016 at 23:15, Lokesh Vutla wrote: > > This provides a way to load a FIT containing U-Boot and a selection of > device > > tree files from a File system. > > > > Signed-off-by: Lokesh Vutla > > --- > > Changes since v2: > > - Fixed the number of bytes being copied. > > > > common/spl/spl_fit.c | 148 > +++ > > include/spl.h| 31 +++ > > 2 files changed, 156 insertions(+), 23 deletions(-) > > > > diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c > > index 1a5c027..f5d47c5 100644 > > --- a/common/spl/spl_fit.c > > +++ b/common/spl/spl_fit.c > > @@ -82,12 +82,42 @@ static int spl_fit_select_fdt(const void *fdt, int > images, int *fdt_offsetp) > > return -ENOENT; > > } > > > > +#define get_fit_size(fit) ALIGN(fdt_totalsize(fit), 4) > > + > > +static int spl_parse_fit_header(void *fit) > > +{ > > + int node; > > + > > + spl_image.images = fdt_path_offset(fit, FIT_IMAGES_PATH); > > + if (spl_image.images < 0) { > > + debug("%s: Cannot find /images node: %d\n", __func__, > > + spl_image.images); > > + return -1; > > + } > > + node = fdt_first_subnode(fit, spl_image.images); > > + if (node < 0) { > > + debug("%s: Cannot find first image node: %d\n", > __func__, node); > > + return -1; > > + } > > + > > + /* Get its information and set up the spl_image structure */ > > + spl_image.data_offset = fdt_getprop_u32(fit, node, > "data-offset"); > > + spl_image.data_size = fdt_getprop_u32(fit, node, "data-size"); > > + spl_image.load_addr = fdt_getprop_u32(fit, node, "load"); > > + debug("data_offset=%x, data_size=%x\n", spl_image.data_offset, > > + spl_image.data_size); > > + spl_image.entry_point = spl_image.load_addr; > > + spl_image.os = IH_OS_U_BOOT; > > + > > + return 0; > > +} > > + > > int spl_load_simple_fit(struct spl_load_info *info, ulong sector, void > *fit) > > { > > int sectors; > > ulong size, load; > > unsigned long count; > > - int node, images; > > + int images, ret; > > void *load_ptr; > > int fdt_offset, fdt_len; > > int data_offset, data_size; > > @@ -99,9 +129,8 @@ int spl_load_simple_fit(struct spl_load_info *info, > ulong sector, void *fit) > > * Figure out where the external images start. This is the base > for the > > * data-offset properties in each image. > > */ > > - size = fdt_totalsize(fit); > > - size = (size + 3) & ~3; > > - base_offset = (size + 3) & ~3; > > + size = get_fit_size(fit); > > + base_offset = size; > > > > /* > > * So far we only have one block of data from the FIT. Read the > entire > > @@ -125,26 +154,13 @@ int spl_load_simple_fit(struct spl_load_info > *info, ulong sector, void *fit) > > if (count == 0) > > return -EIO; > > > > - /* find the firmware image to load */ > > - images = fdt_path_offset(fit, FIT_IMAGES_PATH); > > - if (images < 0) { > > - debug("%s: Cannot find /images node: %d\n", __func__, > images); > > + ret = spl_parse_fit_header(fit); > > + if (ret < 0) > > return -1; > > - } > > - node = fdt_first_subnode(fit, images); > > - if (node < 0) { > > - debug("%s: Cannot find first image node: %d\n", > __func__, node); > > - return -1; > > - } > > - > > - /* Get its information and set up the spl_image structure */ > > - data_offset = fdt_getprop_u32(fit, node, "data-offset"); > > - data_size = fdt_getprop_u32(fit, node, "data-size"); > > - load = fdt_getprop_u32(fit, node, "load"); > > - debug("data_offset=%x, data_size=%x\n", data_offset, data_size); > > - spl_image.load_addr = load; > > - spl_image.entry_point = load; > > - spl_image.os = IH_OS_U_BOOT; > > + data_offset = spl_image.data_offset; > > + data_size = spl_image.data_size; > > + load = spl_image.load_addr; > > + images = spl_image.images; > > > > /* > > * Work out where to place the image. We read it so that the > first > > @@ -192,3 +208,89 @@ int spl_load_simple_fit(struct spl_load_info *info, > ulong sector, void *fit) > > > > return 0; > > } > > + > > +int spl_fs_load_simple_fit(struct spl_load_info *info, const char > *filename, > > + void *fit) > > +{ > > + ulong size, load; > > + unsigned long count; > > + int images, ret; > > + void *load_ptr; > > + int fdt_offset, fdt_len; > > + int data_offset, data_size, file_offset; > > + int base_offset = 0, align_len; > > + void *dst; > > +
Re: [U-Boot] [PATCH v3 1/2] spl: Add an option to load a FIT containing U-Boot from FS
On 13 April 2016 at 23:15, Lokesh Vutlawrote: > This provides a way to load a FIT containing U-Boot and a selection of device > tree files from a File system. > > Signed-off-by: Lokesh Vutla > --- > Changes since v2: > - Fixed the number of bytes being copied. > > common/spl/spl_fit.c | 148 > +++ > include/spl.h| 31 +++ > 2 files changed, 156 insertions(+), 23 deletions(-) > > diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c > index 1a5c027..f5d47c5 100644 > --- a/common/spl/spl_fit.c > +++ b/common/spl/spl_fit.c > @@ -82,12 +82,42 @@ static int spl_fit_select_fdt(const void *fdt, int > images, int *fdt_offsetp) > return -ENOENT; > } > > +#define get_fit_size(fit) ALIGN(fdt_totalsize(fit), 4) > + > +static int spl_parse_fit_header(void *fit) > +{ > + int node; > + > + spl_image.images = fdt_path_offset(fit, FIT_IMAGES_PATH); > + if (spl_image.images < 0) { > + debug("%s: Cannot find /images node: %d\n", __func__, > + spl_image.images); > + return -1; > + } > + node = fdt_first_subnode(fit, spl_image.images); > + if (node < 0) { > + debug("%s: Cannot find first image node: %d\n", __func__, > node); > + return -1; > + } > + > + /* Get its information and set up the spl_image structure */ > + spl_image.data_offset = fdt_getprop_u32(fit, node, "data-offset"); > + spl_image.data_size = fdt_getprop_u32(fit, node, "data-size"); > + spl_image.load_addr = fdt_getprop_u32(fit, node, "load"); > + debug("data_offset=%x, data_size=%x\n", spl_image.data_offset, > + spl_image.data_size); > + spl_image.entry_point = spl_image.load_addr; > + spl_image.os = IH_OS_U_BOOT; > + > + return 0; > +} > + > int spl_load_simple_fit(struct spl_load_info *info, ulong sector, void *fit) > { > int sectors; > ulong size, load; > unsigned long count; > - int node, images; > + int images, ret; > void *load_ptr; > int fdt_offset, fdt_len; > int data_offset, data_size; > @@ -99,9 +129,8 @@ int spl_load_simple_fit(struct spl_load_info *info, ulong > sector, void *fit) > * Figure out where the external images start. This is the base for > the > * data-offset properties in each image. > */ > - size = fdt_totalsize(fit); > - size = (size + 3) & ~3; > - base_offset = (size + 3) & ~3; > + size = get_fit_size(fit); > + base_offset = size; > > /* > * So far we only have one block of data from the FIT. Read the entire > @@ -125,26 +154,13 @@ int spl_load_simple_fit(struct spl_load_info *info, > ulong sector, void *fit) > if (count == 0) > return -EIO; > > - /* find the firmware image to load */ > - images = fdt_path_offset(fit, FIT_IMAGES_PATH); > - if (images < 0) { > - debug("%s: Cannot find /images node: %d\n", __func__, images); > + ret = spl_parse_fit_header(fit); > + if (ret < 0) > return -1; > - } > - node = fdt_first_subnode(fit, images); > - if (node < 0) { > - debug("%s: Cannot find first image node: %d\n", __func__, > node); > - return -1; > - } > - > - /* Get its information and set up the spl_image structure */ > - data_offset = fdt_getprop_u32(fit, node, "data-offset"); > - data_size = fdt_getprop_u32(fit, node, "data-size"); > - load = fdt_getprop_u32(fit, node, "load"); > - debug("data_offset=%x, data_size=%x\n", data_offset, data_size); > - spl_image.load_addr = load; > - spl_image.entry_point = load; > - spl_image.os = IH_OS_U_BOOT; > + data_offset = spl_image.data_offset; > + data_size = spl_image.data_size; > + load = spl_image.load_addr; > + images = spl_image.images; > > /* > * Work out where to place the image. We read it so that the first > @@ -192,3 +208,89 @@ int spl_load_simple_fit(struct spl_load_info *info, > ulong sector, void *fit) > > return 0; > } > + > +int spl_fs_load_simple_fit(struct spl_load_info *info, const char *filename, > + void *fit) > +{ > + ulong size, load; > + unsigned long count; > + int images, ret; > + void *load_ptr; > + int fdt_offset, fdt_len; > + int data_offset, data_size, file_offset; > + int base_offset = 0, align_len; > + void *dst; > + > + /* > +* Figure out where the external images start. This is the base for > the > +* data-offset properties in each image. > +*/ > + size = get_fit_size(fit); > + base_offset = size; > + > + /* > +* Read the entire FIT header, placing it so it finishes