image: android: Add routine to get dtbo params
Android Boot Image v1 adds "Recovery DTB" field in image header and associate payload in boot image itself [1]. Payload should be in Android DTB/DTBO format [2]. That "Recovery DTB" area should be only populated for non-A/B devices, and only in recovery image. Add function to get an address and size of that payload. That function can be further used e.g. in 'abootimg' command to provide the user a way to get the address of recovery dtbo from U-Boot shell, which can be further parsed using 'adtimg' command. [1] https://source.android.com/devices/bootloader/boot-image-header [2] https://source.android.com/devices/architecture/dto/partitions Signed-off-by: Sam Protsenko <joe.skb7@gmail.com> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
This commit is contained in:
		
							parent
							
								
									c3bfad825a
								
							
						
					
					
						commit
						7f2531502c
					
				|  | @ -197,6 +197,67 @@ int android_image_get_second(const struct andr_img_hdr *hdr, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * android_image_get_dtbo() - Get address and size of recovery DTBO image. | ||||||
|  |  * @hdr_addr: Boot image header address | ||||||
|  |  * @addr: If not NULL, will contain address of recovery DTBO image | ||||||
|  |  * @size: If not NULL, will contain size of recovery DTBO image | ||||||
|  |  * | ||||||
|  |  * Get the address and size of DTBO image in "Recovery DTBO" area of Android | ||||||
|  |  * Boot Image in RAM. The format of this image is Android DTBO (see | ||||||
|  |  * corresponding "DTB/DTBO Partitions" AOSP documentation for details). Once | ||||||
|  |  * the address is obtained from this function, one can use 'adtimg' U-Boot | ||||||
|  |  * command or android_dt_*() functions to extract desired DTBO blob. | ||||||
|  |  * | ||||||
|  |  * This DTBO (included in boot image) is only needed for non-A/B devices, and it | ||||||
|  |  * only can be found in recovery image. On A/B devices we can always rely on | ||||||
|  |  * "dtbo" partition. See "Including DTBO in Recovery for Non-A/B Devices" in | ||||||
|  |  * AOSP documentation for details. | ||||||
|  |  * | ||||||
|  |  * Return: true on success or false on error. | ||||||
|  |  */ | ||||||
|  | bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size) | ||||||
|  | { | ||||||
|  | 	const struct andr_img_hdr *hdr; | ||||||
|  | 	ulong dtbo_img_addr; | ||||||
|  | 	bool ret = true; | ||||||
|  | 
 | ||||||
|  | 	hdr = map_sysmem(hdr_addr, sizeof(*hdr)); | ||||||
|  | 	if (android_image_check_header(hdr)) { | ||||||
|  | 		printf("Error: Boot Image header is incorrect\n"); | ||||||
|  | 		ret = false; | ||||||
|  | 		goto exit; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (hdr->header_version < 1) { | ||||||
|  | 		printf("Error: header_version must be >= 1 to get dtbo\n"); | ||||||
|  | 		ret = false; | ||||||
|  | 		goto exit; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (hdr->recovery_dtbo_size == 0) { | ||||||
|  | 		printf("Error: recovery_dtbo_size is 0\n"); | ||||||
|  | 		ret = false; | ||||||
|  | 		goto exit; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Calculate the address of DTB area in boot image */ | ||||||
|  | 	dtbo_img_addr = hdr_addr; | ||||||
|  | 	dtbo_img_addr += hdr->page_size; | ||||||
|  | 	dtbo_img_addr += ALIGN(hdr->kernel_size, hdr->page_size); | ||||||
|  | 	dtbo_img_addr += ALIGN(hdr->ramdisk_size, hdr->page_size); | ||||||
|  | 	dtbo_img_addr += ALIGN(hdr->second_size, hdr->page_size); | ||||||
|  | 
 | ||||||
|  | 	if (addr) | ||||||
|  | 		*addr = dtbo_img_addr; | ||||||
|  | 	if (size) | ||||||
|  | 		*size = hdr->recovery_dtbo_size; | ||||||
|  | 
 | ||||||
|  | exit: | ||||||
|  | 	unmap_sysmem(hdr); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * android_image_get_dtb_img_addr() - Get the address of DTB area in boot image. |  * android_image_get_dtb_img_addr() - Get the address of DTB area in boot image. | ||||||
|  * @hdr_addr: Boot image header address |  * @hdr_addr: Boot image header address | ||||||
|  |  | ||||||
|  | @ -1425,6 +1425,7 @@ int android_image_get_ramdisk(const struct andr_img_hdr *hdr, | ||||||
| 			      ulong *rd_data, ulong *rd_len); | 			      ulong *rd_data, ulong *rd_len); | ||||||
| int android_image_get_second(const struct andr_img_hdr *hdr, | int android_image_get_second(const struct andr_img_hdr *hdr, | ||||||
| 			      ulong *second_data, ulong *second_len); | 			      ulong *second_data, ulong *second_len); | ||||||
|  | bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size); | ||||||
| bool android_image_get_dtb_by_index(ulong hdr_addr, u32 index, ulong *addr, | bool android_image_get_dtb_by_index(ulong hdr_addr, u32 index, ulong *addr, | ||||||
| 				    u32 *size); | 				    u32 *size); | ||||||
| ulong android_image_get_end(const struct andr_img_hdr *hdr); | ulong android_image_get_end(const struct andr_img_hdr *hdr); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue