diff mbox series

[U-Boot,v2] add FIT data-position & data-offset property support

Message ID 1526630192-11723-1-git-send-email-keguang.zhang@gmail.com
State Superseded
Delegated to: Tom Rini
Headers show
Series [U-Boot,v2] add FIT data-position & data-offset property support | expand

Commit Message

Keguang Zhang May 18, 2018, 7:56 a.m. UTC
Add FIT data-position & data-offset property support for bootm,
which were already supported in SPL.

Signed-off-by: Kelvin Cheung <keguang.zhang@gmail.com>
---

Changes for v2:
   create fit_image_get_data_and_size() to remove duplicated code

---
 common/image-fit.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 include/image.h    |  2 ++
 2 files changed, 53 insertions(+), 3 deletions(-)

Comments

Simon Glass May 22, 2018, 11:30 p.m. UTC | #1
Hi,

On 18 May 2018 at 01:56, Kelvin Cheung <keguang.zhang@gmail.com> wrote:
> Add FIT data-position & data-offset property support for bootm,
> which were already supported in SPL.
>
> Signed-off-by: Kelvin Cheung <keguang.zhang@gmail.com>
> ---
>
> Changes for v2:
>    create fit_image_get_data_and_size() to remove duplicated code
>
> ---
>  common/image-fit.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++---
>  include/image.h    |  2 ++
>  2 files changed, 53 insertions(+), 3 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

How can we get this feature integrated into the tests?

Regards,
Simon
Keguang Zhang May 23, 2018, 1:34 a.m. UTC | #2
Hi Simon,


2018-05-23 7:30 GMT+08:00 Simon Glass <sjg@chromium.org>:

> Hi,
>
> On 18 May 2018 at 01:56, Kelvin Cheung <keguang.zhang@gmail.com> wrote:
> > Add FIT data-position & data-offset property support for bootm,
> > which were already supported in SPL.
> >
> > Signed-off-by: Kelvin Cheung <keguang.zhang@gmail.com>
> > ---
> >
> > Changes for v2:
> >    create fit_image_get_data_and_size() to remove duplicated code
> >
> > ---
> >  common/image-fit.c | 54 ++++++++++++++++++++++++++++++
> +++++++++++++++++++++---
> >  include/image.h    |  2 ++
> >  2 files changed, 53 insertions(+), 3 deletions(-)
>
> Reviewed-by: Simon Glass <sjg@chromium.org>
>
> How can we get this feature integrated into the tests?
>
> Do you mean the test scripts under test dir?

BTW, I updated this patch to v3 several days ago.
Thanks!


> Regards,
> Simon
>
Simon Glass May 23, 2018, 4:34 p.m. UTC | #3
Hi Kelvin,

On 22 May 2018 at 19:34, Kelvin Cheung <keguang.zhang@gmail.com> wrote:
> Hi Simon,
>
>
> 2018-05-23 7:30 GMT+08:00 Simon Glass <sjg@chromium.org>:
>>
>> Hi,
>>
>> On 18 May 2018 at 01:56, Kelvin Cheung <keguang.zhang@gmail.com> wrote:
>> > Add FIT data-position & data-offset property support for bootm,
>> > which were already supported in SPL.
>> >
>> > Signed-off-by: Kelvin Cheung <keguang.zhang@gmail.com>
>> > ---
>> >
>> > Changes for v2:
>> >    create fit_image_get_data_and_size() to remove duplicated code
>> >
>> > ---
>> >  common/image-fit.c | 54
>> > +++++++++++++++++++++++++++++++++++++++++++++++++++---
>> >  include/image.h    |  2 ++
>> >  2 files changed, 53 insertions(+), 3 deletions(-)
>>
>> Reviewed-by: Simon Glass <sjg@chromium.org>
>>
>> How can we get this feature integrated into the tests?
>>
> Do you mean the test scripts under test dir?

I mean the test_fit.py test.

>
> BTW, I updated this patch to v3 several days ago.

OK, well please take a look at the test.

Regards,
Simon
diff mbox series

Patch

diff --git a/common/image-fit.c b/common/image-fit.c
index 5b93dce..bc22d8f 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -391,7 +391,7 @@  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);
+	ret = fit_image_get_data_and_size(fit, image_noffset, &data, &size);
 
 #ifndef USE_HOSTCC
 	printf("%s  Data Start:   ", p);
@@ -856,6 +856,54 @@  int fit_image_get_data_size(const void *fit, int noffset, int *data_size)
 }
 
 /**
+ * fit_image_get_data - get data and its size including
+ *			both embedded and external data
+ * @fit: pointer to the FIT format image header
+ * @noffset: component image node offset
+ * @data: double pointer to void, will hold data property's data address
+ * @size: pointer to size_t, will hold data property's data size
+ *
+ * fit_image_get_data() finds data and its size including
+ * both embedded and external data. If the property is found
+ * its data start address and size are returned to the caller.
+ *
+ * returns:
+ *     0, on success
+ *     otherwise, on failure
+ */
+int fit_image_get_data_and_size(const void *fit, int noffset,
+				const void **data, size_t *size)
+{
+	bool external_data = false;
+	int offset;
+	int len;
+	int ret;
+
+	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.
+		 */
+		offset += ((fdt_totalsize(fit) + 3) & ~3);
+	}
+
+	if (external_data) {
+		debug("External Data\n");
+		ret = fit_image_get_data_size(fit, noffset, &len);
+		*data = fit + offset;
+		*size = len;
+	} else {
+		ret = fit_image_get_data(fit, noffset, data, size);
+	}
+
+	return ret;
+}
+
+/**
  * fit_image_hash_get_algo - get hash algorithm name
  * @fit: pointer to the FIT format image header
  * @noffset: hash node offset
@@ -1153,7 +1201,7 @@  int fit_image_verify(const void *fit, int image_noffset)
 	char		*err_msg = "";
 
 	/* Get image data and data length */
-	if (fit_image_get_data(fit, image_noffset, &data, &size)) {
+	if (fit_image_get_data_and_size(fit, image_noffset, &data, &size)) {
 		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),
@@ -1875,7 +1923,7 @@  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_and_size(fit, noffset, &buf, &size)) {
 		printf("Could not find %s subimage data!\n", prop_name);
 		bootstage_error(bootstage_id + BOOTSTAGE_SUB_GET_DATA);
 		return -ENOENT;
diff --git a/include/image.h b/include/image.h
index df701e3..1aed910 100644
--- a/include/image.h
+++ b/include/image.h
@@ -987,6 +987,8 @@  int fit_image_get_data_offset(const void *fit, int noffset, int *data_offset);
 int fit_image_get_data_position(const void *fit, int noffset,
 				int *data_position);
 int fit_image_get_data_size(const void *fit, int noffset, int *data_size);
+int fit_image_get_data_and_size(const void *fit, int noffset,
+				const void **data, size_t *size);
 
 int fit_image_hash_get_algo(const void *fit, int noffset, char **algo);
 int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value,