diff mbox series

[v6,22/25] spl: spl_legacy: fix the use of SPL_COPY_PAYLOAD_ONLY

Message ID 3ab12837efcbaff6d17e63bc3574653585b3b962.1653015383.git.weijie.gao@mediatek.com
State Accepted
Commit fdc03bf4e9342b2ccc553021554270624852cf84
Delegated to: Daniel Schwierzeck
Headers show
Series Add support for MediaTek MT7621 SoC - v6 | expand

Commit Message

Weijie Gao (高惟杰) May 20, 2022, 3:23 a.m. UTC
If the payload is compressed, SPL_COPY_PAYLOAD_ONLY should always be set
since the payload will not be directly read to its load address. The
payload will first be read to a temporary buffer, and then be decompressed
to its load address, without image header.

If the payload is not compressed, and SPL_COPY_PAYLOAD_ONLY is set, image
header should be skipped on loading. Otherwise image header should also be
read to its load address.

Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
---
v6 changes: none
v5 changes: none
v4 changes: new
---
 common/spl/spl_legacy.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/common/spl/spl_legacy.c b/common/spl/spl_legacy.c
index 2ec7154423..ae8731c782 100644
--- a/common/spl/spl_legacy.c
+++ b/common/spl/spl_legacy.c
@@ -88,15 +88,29 @@  int spl_load_legacy_img(struct spl_image_info *spl_image,
 	/* 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)
+		spl_image->flags |= SPL_COPY_PAYLOAD_ONLY;
+
 	ret = spl_parse_image_header(spl_image, bootdev, &hdr);
 	if (ret)
 		return ret;
 
-	dataptr = header + sizeof(hdr);
-
 	/* Read image */
 	switch (spl_image_get_comp(&hdr)) {
 	case IH_COMP_NONE:
+		dataptr = header;
+
+		/*
+		 * Image header will be skipped only if SPL_COPY_PAYLOAD_ONLY
+		 * is set
+		 */
+		if (spl_image->flags & SPL_COPY_PAYLOAD_ONLY)
+			dataptr += sizeof(hdr);
+
 		load->read(load, dataptr, spl_image->size,
 			   (void *)(unsigned long)spl_image->load_addr);
 		break;
@@ -104,6 +118,9 @@  int spl_load_legacy_img(struct spl_image_info *spl_image,
 	case IH_COMP_LZMA:
 		lzma_len = LZMA_LEN;
 
+		/* dataptr points to compressed payload  */
+		dataptr = header + sizeof(hdr);
+
 		debug("LZMA: Decompressing %08lx to %08lx\n",
 		      dataptr, spl_image->load_addr);
 		src = malloc(spl_image->size);