spl: spl_legacy: Fix NAND boot on OMAP3 BeagleBoard
OMAP3 BeagleBoard NAND boot hangs when spl_load_legacy_img() tries to read the header into 'struct hdr' which is allocated on the stack. As the header has already been read once before by spl_nand.c, we can avoid the extra header allocation and read here by simply passing around the pointer to the header. This fixes NAND boot on OMAP3 BeagleBoard. Signed-off-by: Roger Quadros <rogerq@kernel.org> Reviewed-By: Michael Trimarchi <michael@amarulasolutions.com>
This commit is contained in:
		
							parent
							
								
									0abe3323f5
								
							
						
					
					
						commit
						06377c5a1f
					
				|  | @ -77,32 +77,29 @@ static inline int spl_image_get_comp(const struct legacy_img_hdr *hdr) | |||
| 
 | ||||
| int spl_load_legacy_img(struct spl_image_info *spl_image, | ||||
| 			struct spl_boot_device *bootdev, | ||||
| 			struct spl_load_info *load, ulong header) | ||||
| 			struct spl_load_info *load, ulong offset, | ||||
| 			struct legacy_img_hdr *hdr) | ||||
| { | ||||
| 	__maybe_unused SizeT lzma_len; | ||||
| 	__maybe_unused void *src; | ||||
| 	struct legacy_img_hdr hdr; | ||||
| 	ulong dataptr; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	/* Read header into local struct */ | ||||
| 	load->read(load, header, sizeof(hdr), &hdr); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If the payload is compressed, the decompressed data should be | ||||
| 	 * directly write to its load address. | ||||
| 	 */ | ||||
| 	if (spl_image_get_comp(&hdr) != IH_COMP_NONE) | ||||
| 	if (spl_image_get_comp(hdr) != IH_COMP_NONE) | ||||
| 		spl_image->flags |= SPL_COPY_PAYLOAD_ONLY; | ||||
| 
 | ||||
| 	ret = spl_parse_image_header(spl_image, bootdev, &hdr); | ||||
| 	ret = spl_parse_image_header(spl_image, bootdev, hdr); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	/* Read image */ | ||||
| 	switch (spl_image_get_comp(&hdr)) { | ||||
| 	switch (spl_image_get_comp(hdr)) { | ||||
| 	case IH_COMP_NONE: | ||||
| 		dataptr = header; | ||||
| 		dataptr = offset; | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * Image header will be skipped only if SPL_COPY_PAYLOAD_ONLY | ||||
|  | @ -119,7 +116,7 @@ int spl_load_legacy_img(struct spl_image_info *spl_image, | |||
| 		lzma_len = LZMA_LEN; | ||||
| 
 | ||||
| 		/* dataptr points to compressed payload  */ | ||||
| 		dataptr = header + sizeof(hdr); | ||||
| 		dataptr = offset + sizeof(hdr); | ||||
| 
 | ||||
| 		debug("LZMA: Decompressing %08lx to %08lx\n", | ||||
| 		      dataptr, spl_image->load_addr); | ||||
|  | @ -143,7 +140,7 @@ int spl_load_legacy_img(struct spl_image_info *spl_image, | |||
| 
 | ||||
| 	default: | ||||
| 		debug("Compression method %s is not supported\n", | ||||
| 		      genimg_get_comp_short_name(image_get_comp(&hdr))); | ||||
| 		      genimg_get_comp_short_name(image_get_comp(hdr))); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -119,7 +119,7 @@ static int spl_nand_load_element(struct spl_image_info *spl_image, | |||
| 		load.bl_len = 1; | ||||
| 		load.read = spl_nand_legacy_read; | ||||
| 
 | ||||
| 		return spl_load_legacy_img(spl_image, bootdev, &load, offset); | ||||
| 		return spl_load_legacy_img(spl_image, bootdev, &load, offset, header); | ||||
| 	} else { | ||||
| 		err = spl_parse_image_header(spl_image, bootdev, header); | ||||
| 		if (err) | ||||
|  |  | |||
|  | @ -111,10 +111,14 @@ static int spl_nor_load_image(struct spl_image_info *spl_image, | |||
| 
 | ||||
| 	/* Legacy image handling */ | ||||
| 	if (IS_ENABLED(CONFIG_SPL_LEGACY_IMAGE_FORMAT)) { | ||||
| 		struct legacy_img_hdr hdr; | ||||
| 
 | ||||
| 		load.bl_len = 1; | ||||
| 		load.read = spl_nor_load_read; | ||||
| 		spl_nor_load_read(&load, spl_nor_get_uboot_base(), sizeof(hdr), &hdr); | ||||
| 		return spl_load_legacy_img(spl_image, bootdev, &load, | ||||
| 					   spl_nor_get_uboot_base()); | ||||
| 					   spl_nor_get_uboot_base(), | ||||
| 					   &hdr); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
|  |  | |||
|  | @ -353,7 +353,8 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, | |||
|  * spl_load_legacy_img() - Loads a legacy image from a device. | ||||
|  * @spl_image:	Image description to set up | ||||
|  * @load:	Structure containing the information required to load data. | ||||
|  * @header:	Pointer to image header (including appended image) | ||||
|  * @offset:	Pointer to image | ||||
|  * @hdr:	Pointer to image header | ||||
|  * | ||||
|  * Reads an legacy image from the device. Loads u-boot image to | ||||
|  * specified load address. | ||||
|  | @ -361,7 +362,9 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, | |||
|  */ | ||||
| int spl_load_legacy_img(struct spl_image_info *spl_image, | ||||
| 			struct spl_boot_device *bootdev, | ||||
| 			struct spl_load_info *load, ulong header); | ||||
| 			struct spl_load_info *load, ulong offset, | ||||
| 			struct legacy_img_hdr *hdr); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * spl_load_imx_container() - Loads a imx container image from a device. | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue