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, | int spl_load_legacy_img(struct spl_image_info *spl_image, | ||||||
| 			struct spl_boot_device *bootdev, | 			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 SizeT lzma_len; | ||||||
| 	__maybe_unused void *src; | 	__maybe_unused void *src; | ||||||
| 	struct legacy_img_hdr hdr; |  | ||||||
| 	ulong dataptr; | 	ulong dataptr; | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	/* Read header into local struct */ |  | ||||||
| 	load->read(load, header, sizeof(hdr), &hdr); |  | ||||||
| 
 |  | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * If the payload is compressed, the decompressed data should be | 	 * If the payload is compressed, the decompressed data should be | ||||||
| 	 * directly write to its load address. | 	 * 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; | 		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) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
| 
 | 
 | ||||||
| 	/* Read image */ | 	/* Read image */ | ||||||
| 	switch (spl_image_get_comp(&hdr)) { | 	switch (spl_image_get_comp(hdr)) { | ||||||
| 	case IH_COMP_NONE: | 	case IH_COMP_NONE: | ||||||
| 		dataptr = header; | 		dataptr = offset; | ||||||
| 
 | 
 | ||||||
| 		/*
 | 		/*
 | ||||||
| 		 * Image header will be skipped only if SPL_COPY_PAYLOAD_ONLY | 		 * 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; | 		lzma_len = LZMA_LEN; | ||||||
| 
 | 
 | ||||||
| 		/* dataptr points to compressed payload  */ | 		/* dataptr points to compressed payload  */ | ||||||
| 		dataptr = header + sizeof(hdr); | 		dataptr = offset + sizeof(hdr); | ||||||
| 
 | 
 | ||||||
| 		debug("LZMA: Decompressing %08lx to %08lx\n", | 		debug("LZMA: Decompressing %08lx to %08lx\n", | ||||||
| 		      dataptr, spl_image->load_addr); | 		      dataptr, spl_image->load_addr); | ||||||
|  | @ -143,7 +140,7 @@ int spl_load_legacy_img(struct spl_image_info *spl_image, | ||||||
| 
 | 
 | ||||||
| 	default: | 	default: | ||||||
| 		debug("Compression method %s is not supported\n", | 		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; | 		return -EINVAL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -119,7 +119,7 @@ static int spl_nand_load_element(struct spl_image_info *spl_image, | ||||||
| 		load.bl_len = 1; | 		load.bl_len = 1; | ||||||
| 		load.read = spl_nand_legacy_read; | 		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 { | 	} else { | ||||||
| 		err = spl_parse_image_header(spl_image, bootdev, header); | 		err = spl_parse_image_header(spl_image, bootdev, header); | ||||||
| 		if (err) | 		if (err) | ||||||
|  |  | ||||||
|  | @ -111,10 +111,14 @@ static int spl_nor_load_image(struct spl_image_info *spl_image, | ||||||
| 
 | 
 | ||||||
| 	/* Legacy image handling */ | 	/* Legacy image handling */ | ||||||
| 	if (IS_ENABLED(CONFIG_SPL_LEGACY_IMAGE_FORMAT)) { | 	if (IS_ENABLED(CONFIG_SPL_LEGACY_IMAGE_FORMAT)) { | ||||||
|  | 		struct legacy_img_hdr hdr; | ||||||
|  | 
 | ||||||
| 		load.bl_len = 1; | 		load.bl_len = 1; | ||||||
| 		load.read = spl_nor_load_read; | 		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, | 		return spl_load_legacy_img(spl_image, bootdev, &load, | ||||||
| 					   spl_nor_get_uboot_base()); | 					   spl_nor_get_uboot_base(), | ||||||
|  | 					   &hdr); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	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_load_legacy_img() - Loads a legacy image from a device. | ||||||
|  * @spl_image:	Image description to set up |  * @spl_image:	Image description to set up | ||||||
|  * @load:	Structure containing the information required to load data. |  * @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 |  * Reads an legacy image from the device. Loads u-boot image to | ||||||
|  * specified load address. |  * 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, | int spl_load_legacy_img(struct spl_image_info *spl_image, | ||||||
| 			struct spl_boot_device *bootdev, | 			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. |  * spl_load_imx_container() - Loads a imx container image from a device. | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue