[U-Boot] [PATCH] armv8: sec_firmware: Add support for multiple loadables

York Sun york.sun at nxp.com
Mon Jan 15 16:45:45 UTC 2018


On 01/14/2018 08:55 PM, Sumit Garg wrote:
> Enable support for multiple loadable images in SEC firmware FIT image.
> 
> Signed-off-by: Sumit Garg <sumit.garg at nxp.com>
> ---
>  arch/arm/cpu/armv8/sec_firmware.c | 51 +++++++++++++++++++++++++++++++--------
>  1 file changed, 41 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/arm/cpu/armv8/sec_firmware.c b/arch/arm/cpu/armv8/sec_firmware.c
> index 927eae4..28de81c 100644
> --- a/arch/arm/cpu/armv8/sec_firmware.c
> +++ b/arch/arm/cpu/armv8/sec_firmware.c
> @@ -116,11 +116,13 @@ static int sec_firmware_check_copy_loadable(const void *sec_firmware_img,
>  					    u32 *loadable_l, u32 *loadable_h)
>  {
>  	phys_addr_t sec_firmware_loadable_addr = 0;
> -	int conf_node_off, ld_node_off;
> +	int conf_node_off, ld_node_off, images;
>  	char *conf_node_name = NULL;
>  	const void *data;
>  	size_t size;
>  	ulong load;
> +	const char *name, *str, *type;
> +	int len;
>  
>  	conf_node_name = SEC_FIRMEWARE_FIT_CNF_NAME;
>  
> @@ -130,11 +132,32 @@ static int sec_firmware_check_copy_loadable(const void *sec_firmware_img,
>  	return -ENOENT;
>  	}
>  
> -	ld_node_off = fit_conf_get_prop_node(sec_firmware_img, conf_node_off,
> -					     FIT_LOADABLE_PROP);
> -	if (ld_node_off >= 0) {
> -		printf("SEC Firmware: '%s' present in config\n",
> -		       FIT_LOADABLE_PROP);
> +	/* find the node holding the images information */
> +	images = fdt_path_offset(sec_firmware_img, FIT_IMAGES_PATH);
> +	if (images < 0) {
> +		debug("%s: Cannot find /images node: %d\n", __func__, images);

Do you expect this often? If it should happen, change debug to printf.

> +		return -1;
> +	}
> +
> +	type = FIT_LOADABLE_PROP;
> +
> +	name = fdt_getprop(sec_firmware_img, conf_node_off, type, &len);
> +	if (!name) {
> +		/* Loadables not present */
> +		return 0;
> +	}
> +
> +	printf("SEC Firmware: '%s' present in config\n", type);

How about replace printf() with debug()?

> +
> +	for (str = name; str && ((str - name) < len);
> +	     str = strchr(str, '\0') + 1) {
> +		printf("%s: '%s'\n", type, str);
> +		ld_node_off = fdt_subnode_offset(sec_firmware_img, images, str);
> +		if (ld_node_off < 0) {
> +			printf("cannot find image node '%s': %d\n", str,
> +			       ld_node_off);
> +			return -EINVAL;
> +		}
>  
>  		/* Verify secure firmware image */
>  		if (!(fit_image_verify(sec_firmware_img, ld_node_off))) {
> @@ -164,11 +187,19 @@ static int sec_firmware_check_copy_loadable(const void *sec_firmware_img,
>  		memcpy((void *)sec_firmware_loadable_addr, data, size);
>  		flush_dcache_range(sec_firmware_loadable_addr,
>  				   sec_firmware_loadable_addr + size);
> -	}
>  
> -	/* Populate address ptrs for loadable image with loadbale addr */
> -	out_le32(loadable_l, (sec_firmware_loadable_addr & WORD_MASK));
> -	out_le32(loadable_h, (sec_firmware_loadable_addr >> WORD_SHIFT));
> +		/* Populate loadable address only for Trusted OS */
> +		if (!strcmp(str, "trustedOS at 1")) {
> +			/*
> +			 * Populate address ptrs for loadable image with
> +			 * loadbale addr
> +			 */
> +			out_le32(loadable_l, (sec_firmware_loadable_addr &
> +					      WORD_MASK));
> +			out_le32(loadable_h, (sec_firmware_loadable_addr >>
> +					      WORD_SHIFT));
> +		}
> +	}
>  
>  	return 0;
>  }
> 

It is unclear that you are looking for "trustedOS at 1" to set the address.
Please add some document to describe the FIT image you are expecting.

York


More information about the U-Boot mailing list