diff mbox

[U-Boot,1/3] image: Add FIT image loadable section custom processing

Message ID 20161121201447.814-2-afd@ti.com
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Andrew Davis Nov. 21, 2016, 8:14 p.m. UTC
To help automate the loading of custom image types we add the ability
to define custom handlers for the loadable section types. When we find
a compatible type while loading a "loadable" image from a FIT image we
run its associated handlers to perform any additional steps needed for
loading this image.

Signed-off-by: Andrew F. Davis <afd@ti.com>
---
 common/image.c  | 33 +++++++++++++++++++++++++++++++++
 include/image.h | 11 +++++++++++
 2 files changed, 44 insertions(+)

Comments

Simon Glass Nov. 24, 2016, 2:20 a.m. UTC | #1
Hi Andrew,

On 21 November 2016 at 13:14, Andrew F. Davis <afd@ti.com> wrote:
> To help automate the loading of custom image types we add the ability
> to define custom handlers for the loadable section types. When we find
> a compatible type while loading a "loadable" image from a FIT image we
> run its associated handlers to perform any additional steps needed for
> loading this image.
>
> Signed-off-by: Andrew F. Davis <afd@ti.com>
> ---
>  common/image.c  | 33 +++++++++++++++++++++++++++++++++
>  include/image.h | 11 +++++++++++
>  2 files changed, 44 insertions(+)

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

But please comment U_BOOT_FIT_LOADABLE_HANDLER and its associated struct.

Also can you add some documentation somewhere? Perhaps to
source_file_format.txt?

Regards,
Simon
Andrew Davis Nov. 29, 2016, 4:51 p.m. UTC | #2
On 11/23/2016 08:20 PM, Simon Glass wrote:
> Hi Andrew,
> 
> On 21 November 2016 at 13:14, Andrew F. Davis <afd@ti.com> wrote:
>> To help automate the loading of custom image types we add the ability
>> to define custom handlers for the loadable section types. When we find
>> a compatible type while loading a "loadable" image from a FIT image we
>> run its associated handlers to perform any additional steps needed for
>> loading this image.
>>
>> Signed-off-by: Andrew F. Davis <afd@ti.com>
>> ---
>>  common/image.c  | 33 +++++++++++++++++++++++++++++++++
>>  include/image.h | 11 +++++++++++
>>  2 files changed, 44 insertions(+)
> 
> Reviewed-by: Simon Glass <sjg@chromium.org>
> 
> But please comment U_BOOT_FIT_LOADABLE_HANDLER and its associated struct.
> 
> Also can you add some documentation somewhere? Perhaps to
> source_file_format.txt?
> 

Works for me, will add for v2.

Thanks,
Andrew
diff mbox

Patch

diff --git a/common/image.c b/common/image.c
index 7604494..2aac90d 100644
--- a/common/image.c
+++ b/common/image.c
@@ -1389,6 +1389,23 @@  int boot_get_fpga(int argc, char * const argv[], bootm_headers_t *images,
 }
 #endif
 
+static void fit_loadable_process(uint8_t img_type,
+				 ulong img_data,
+				 ulong img_len)
+{
+	int i;
+	const unsigned int count =
+			ll_entry_count(struct fit_loadable_tbl, fit_loadable);
+	struct fit_loadable_tbl *fit_loadable_handler =
+			ll_entry_start(struct fit_loadable_tbl, fit_loadable);
+	/* For each loadable handler */
+	for (i = 0; i < count; i++, fit_loadable_handler++)
+		/* matching this type */
+		if (fit_loadable_handler->type == img_type)
+			/* call that handler with this image data */
+			fit_loadable_handler->handler(img_data, img_len);
+}
+
 int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images,
 		uint8_t arch, const ulong *ld_start, ulong * const ld_len)
 {
@@ -1407,6 +1424,7 @@  int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images,
 	int conf_noffset;
 	int fit_img_result;
 	const char *uname;
+	uint8_t img_type;
 
 	/* Check to see if the images struct has a FIT configuration */
 	if (!genimg_has_config(images)) {
@@ -1447,6 +1465,21 @@  int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images,
 				/* Something went wrong! */
 				return fit_img_result;
 			}
+
+			fit_img_result = fit_image_get_node(buf, uname);
+			if (fit_img_result < 0) {
+				/* Something went wrong! */
+				return fit_img_result;
+			}
+			fit_img_result = fit_image_get_type(buf,
+							    fit_img_result,
+							    &img_type);
+			if (fit_img_result < 0) {
+				/* Something went wrong! */
+				return fit_img_result;
+			}
+
+			fit_loadable_process(img_type, img_data, img_len);
 		}
 		break;
 	default:
diff --git a/include/image.h b/include/image.h
index 2b1296c..a8b81b5 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1263,4 +1263,15 @@  int board_fit_config_name_match(const char *name);
 void board_fit_image_post_process(void **p_image, size_t *p_size);
 #endif /* CONFIG_SPL_FIT_IMAGE_POST_PROCESS */
 
+struct fit_loadable_tbl {
+	int type;
+	void (*handler)(ulong data, size_t size);
+};
+
+#define U_BOOT_FIT_LOADABLE_HANDLER(_type, _handler) \
+	ll_entry_declare(struct fit_loadable_tbl, _function, fit_loadable) = { \
+		.type = _type, \
+		.handler = _handler, \
+	}
+
 #endif	/* __IMAGE_H__ */