diff mbox series

[v3,4/4] bootm: Support kernel_noload with compression

Message ID 20231119144338.630138-2-sjg@chromium.org
State Accepted
Commit 69544c4fd8b1e77e00403e9a6cba7e2d7bb3ff68
Delegated to: Tom Rini
Headers show
Series bootm: Handle compressed arm64 images with bootm | expand

Commit Message

Simon Glass Nov. 19, 2023, 2:43 p.m. UTC
It is not currently possible to execute the kernel in-place without
loading it. Use lmb to allocate memory for it.

Co-developed-by: Tom Rini <trini@konsulko.com>
Signed-off-by: Tom Rini <trini@konsulko.com>
Signed-off-by: Simon Glass <sjg@chromium.org>
Suggested-by: Tom Rini <trini@konsulko.com>
---

Changes in v3:
- Rebase on to bootm-refactoring series
- Support compression with an lmb-allocated region
- Drop patch to disallow kernel_noload with compression
- Drop patch 'bootm: Allow omitting the load address'

Changes in v2:
- Add a 'success' case to the cover letter
- Redo how the arm64 support is implemented

 boot/bootm.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
diff mbox series

Patch

diff --git a/boot/bootm.c b/boot/bootm.c
index cf07c042fbca..301cfded05cb 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -629,6 +629,24 @@  static int bootm_load_os(struct bootm_headers *images, int boot_progress)
 	void *load_buf, *image_buf;
 	int err;
 
+	/*
+	 * For a "noload" compressed kernel we need to allocate a buffer large
+	 * enough to decompress in to and use that as the load address now.
+	 * Assume that the kernel compression is at most a factor of 4 since
+	 * zstd almost achieves that.
+	 * Use an alignment of 2MB since this might help arm64
+	 */
+	if (os.type == IH_TYPE_KERNEL_NOLOAD && os.comp != IH_COMP_NONE) {
+		ulong req_size = ALIGN(image_len * 4, SZ_1M);
+
+		load = lmb_alloc(&images->lmb, req_size, SZ_2M);
+		if (!load)
+			return 1;
+		os.load = load;
+		debug("Allocated %lx bytes at %lx for kernel (size %lx) decompression\n",
+		      req_size, load, image_len);
+	}
+
 	load_buf = map_sysmem(load, 0);
 	image_buf = map_sysmem(os.image_start, image_len);
 	err = image_decomp(os.comp, load, os.image_start, os.type,