public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [PATCH 1/3] spl: fit: Discard decompression if not supported
@ 2023-11-03 14:34 Loic Poulain
  2023-11-03 14:34 ` [PATCH 2/3] spl: fit: Add support for LZO compressed images Loic Poulain
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Loic Poulain @ 2023-11-03 14:34 UTC (permalink / raw)
  To: sjg, marex; +Cc: u-boot, abbaraju.manojsai, seanga2, Loic Poulain

And simplify further decompression testing.

Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
---
 common/spl/spl_fit.c | 27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index 70d8d5942d..1d42cb1d10 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -208,6 +208,20 @@ static int get_aligned_image_size(struct spl_load_info *info, int data_size,
 	return (data_size + info->bl_len - 1) / info->bl_len;
 }
 
+static inline bool spl_fit_decompression_supported(uint8_t comp)
+{
+	switch (comp) {
+	case IH_COMP_GZIP:
+		return IS_ENABLED(CONFIG_SPL_GZIP);
+	case IH_COMP_LZMA:
+		return IS_ENABLED(CONFIG_SPL_LZMA);
+	case IH_COMP_NONE:
+		return true;
+	}
+
+	return false;
+}
+
 /**
  * load_simple_fit(): load the image described in a certain FIT node
  * @info:	points to information about the device to load data from
@@ -235,7 +249,7 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
 	void *src;
 	ulong overhead;
 	int nr_sectors;
-	uint8_t image_comp = -1, type = -1;
+	uint8_t image_comp, type = -1;
 	const void *data;
 	const void *fit = ctx->fit;
 	bool external_data = false;
@@ -248,9 +262,11 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
 			debug("%s ", genimg_get_type_name(type));
 	}
 
-	if (spl_decompression_enabled()) {
-		fit_image_get_comp(fit, node, &image_comp);
-		debug("%s ", genimg_get_comp_name(image_comp));
+	fit_image_get_comp(fit, node, &image_comp);
+	if (!spl_fit_decompression_supported(image_comp)) {
+		debug("Discard unsupported compression %s ",
+		      genimg_get_comp_name(image_comp));
+		image_comp = IH_COMP_NONE;
 	}
 
 	if (fit_image_get_load(fit, node, &load_addr)) {
@@ -283,8 +299,7 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
 			return 0;
 		}
 
-		if (spl_decompression_enabled() &&
-		    (image_comp == IH_COMP_GZIP || image_comp == IH_COMP_LZMA))
+		if (image_comp != IH_COMP_NONE)
 			src_ptr = map_sysmem(ALIGN(CONFIG_SYS_LOAD_ADDR, ARCH_DMA_MINALIGN), len);
 		else
 			src_ptr = map_sysmem(ALIGN(load_addr, ARCH_DMA_MINALIGN), len);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/3] spl: fit: Add support for LZO compressed images
  2023-11-03 14:34 [PATCH 1/3] spl: fit: Discard decompression if not supported Loic Poulain
@ 2023-11-03 14:34 ` Loic Poulain
  2023-11-04 15:19   ` Sean Anderson
  2023-11-03 14:34 ` [PATCH 3/3] spl: fit: Load compressed blob to heap buffer Loic Poulain
  2023-11-04 15:10 ` [PATCH 1/3] spl: fit: Discard decompression if not supported Sean Anderson
  2 siblings, 1 reply; 6+ messages in thread
From: Loic Poulain @ 2023-11-03 14:34 UTC (permalink / raw)
  To: sjg, marex; +Cc: u-boot, abbaraju.manojsai, seanga2, Loic Poulain

Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
---
 common/spl/spl_fit.c | 10 ++++++++++
 include/spl.h        |  4 +++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index 1d42cb1d10..08428660b0 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -18,6 +18,7 @@
 #include <asm/global_data.h>
 #include <asm/io.h>
 #include <linux/libfdt.h>
+#include <linux/lzo.h>
 #include <linux/printk.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -215,6 +216,8 @@ static inline bool spl_fit_decompression_supported(uint8_t comp)
 		return IS_ENABLED(CONFIG_SPL_GZIP);
 	case IH_COMP_LZMA:
 		return IS_ENABLED(CONFIG_SPL_LZMA);
+	case IH_COMP_LZO:
+		return IS_ENABLED(CONFIG_SPL_LZO);
 	case IH_COMP_NONE:
 		return true;
 	}
@@ -357,6 +360,13 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
 			return -EIO;
 		}
 		length = loadEnd - CONFIG_SYS_LOAD_ADDR;
+	} else if (IS_ENABLED(CONFIG_SPL_LZO) && image_comp == IH_COMP_LZO) {
+		size = CONFIG_SYS_BOOTM_LEN;
+		if (lzop_decompress(src, length, load_ptr, &size)) {
+			puts("Uncompressing error\n");
+			return -EIO;
+		}
+		length = size;
 	} else {
 		memcpy(load_ptr, src, length);
 	}
diff --git a/include/spl.h b/include/spl.h
index 8ff20adc28..e07092372a 100644
--- a/include/spl.h
+++ b/include/spl.h
@@ -1016,6 +1016,8 @@ int spl_load_fit_image(struct spl_image_info *spl_image,
  */
 static inline bool spl_decompression_enabled(void)
 {
-	return IS_ENABLED(CONFIG_SPL_GZIP) || IS_ENABLED(CONFIG_SPL_LZMA);
+	return IS_ENABLED(CONFIG_SPL_GZIP) || IS_ENABLED(CONFIG_SPL_LZMA) ||
+		IS_ENABLED(CONFIG_SPL_LZO);
 }
+
 #endif
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/3] spl: fit: Load compressed blob to heap buffer
  2023-11-03 14:34 [PATCH 1/3] spl: fit: Discard decompression if not supported Loic Poulain
  2023-11-03 14:34 ` [PATCH 2/3] spl: fit: Add support for LZO compressed images Loic Poulain
@ 2023-11-03 14:34 ` Loic Poulain
  2023-11-04 15:13   ` Sean Anderson
  2023-11-04 15:10 ` [PATCH 1/3] spl: fit: Discard decompression if not supported Sean Anderson
  2 siblings, 1 reply; 6+ messages in thread
From: Loic Poulain @ 2023-11-03 14:34 UTC (permalink / raw)
  To: sjg, marex; +Cc: u-boot, abbaraju.manojsai, seanga2, Loic Poulain

CONFIG_SYS_LOAD_ADDR is usually configured as the address where
the kernel should be loaded at. It can be problematic to use it
as a generic temporary buffer for FIT compressed blobs.

An example is when the image is a compressed kernel with load
address equal to CONFIG_SYS_LOAD_ADDR, this causes (inplace)
decompression to fail.

Instead we can simply allocate a temporary buffer in the heap

Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
---
 common/spl/spl_fit.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index 08428660b0..8a807db5ba 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -249,7 +249,7 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
 	ulong size;
 	ulong load_addr;
 	void *load_ptr;
-	void *src;
+	void *src, *src_ptr;
 	ulong overhead;
 	int nr_sectors;
 	uint8_t image_comp, type = -1;
@@ -289,8 +289,6 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
 	}
 
 	if (external_data) {
-		void *src_ptr;
-
 		/* External data */
 		if (fit_image_get_data_size(fit, node, &len))
 			return -ENOENT;
@@ -302,10 +300,13 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
 			return 0;
 		}
 
-		if (image_comp != IH_COMP_NONE)
-			src_ptr = map_sysmem(ALIGN(CONFIG_SYS_LOAD_ADDR, ARCH_DMA_MINALIGN), len);
-		else
+		if (image_comp != IH_COMP_NONE) {
+			src_ptr = malloc_cache_aligned(len + 2 * info->bl_len);
+			if (!src_ptr)
+				return -ENOMEM;
+		} else {
 			src_ptr = map_sysmem(ALIGN(load_addr, ARCH_DMA_MINALIGN), len);
+		}
 		length = len;
 
 		overhead = get_aligned_image_overhead(info, offset);
@@ -383,6 +384,9 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
 			image_info->entry_point = FDT_ERROR;
 	}
 
+	if (external_data && image_comp != IH_COMP_NONE)
+		free(src_ptr);
+
 	return 0;
 }
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/3] spl: fit: Discard decompression if not supported
  2023-11-03 14:34 [PATCH 1/3] spl: fit: Discard decompression if not supported Loic Poulain
  2023-11-03 14:34 ` [PATCH 2/3] spl: fit: Add support for LZO compressed images Loic Poulain
  2023-11-03 14:34 ` [PATCH 3/3] spl: fit: Load compressed blob to heap buffer Loic Poulain
@ 2023-11-04 15:10 ` Sean Anderson
  2 siblings, 0 replies; 6+ messages in thread
From: Sean Anderson @ 2023-11-04 15:10 UTC (permalink / raw)
  To: Loic Poulain, sjg, marex; +Cc: u-boot, abbaraju.manojsai

On 11/3/23 10:34, Loic Poulain wrote:
> And simplify further decompression testing.
> 
> Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
> ---
>   common/spl/spl_fit.c | 27 +++++++++++++++++++++------
>   1 file changed, 21 insertions(+), 6 deletions(-)
> 
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index 70d8d5942d..1d42cb1d10 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -208,6 +208,20 @@ static int get_aligned_image_size(struct spl_load_info *info, int data_size,
>   	return (data_size + info->bl_len - 1) / info->bl_len;
>   }
>   
> +static inline bool spl_fit_decompression_supported(uint8_t comp)
> +{
> +	switch (comp) {
> +	case IH_COMP_GZIP:
> +		return IS_ENABLED(CONFIG_SPL_GZIP);
> +	case IH_COMP_LZMA:
> +		return IS_ENABLED(CONFIG_SPL_LZMA);
> +	case IH_COMP_NONE:
> +		return true;
> +	}
> +
> +	return false;
> +}
> +
>   /**
>    * load_simple_fit(): load the image described in a certain FIT node
>    * @info:	points to information about the device to load data from
> @@ -235,7 +249,7 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
>   	void *src;
>   	ulong overhead;
>   	int nr_sectors;
> -	uint8_t image_comp = -1, type = -1;
> +	uint8_t image_comp, type = -1;
>   	const void *data;
>   	const void *fit = ctx->fit;
>   	bool external_data = false;
> @@ -248,9 +262,11 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
>   			debug("%s ", genimg_get_type_name(type));
>   	}
>   
> -	if (spl_decompression_enabled()) {
> -		fit_image_get_comp(fit, node, &image_comp);
> -		debug("%s ", genimg_get_comp_name(image_comp));
> +	fit_image_get_comp(fit, node, &image_comp);
> +	if (!spl_fit_decompression_supported(image_comp)) {
> +		debug("Discard unsupported compression %s ",
> +		      genimg_get_comp_name(image_comp));
> +		image_comp = IH_COMP_NONE;
>   	}
>   
>   	if (fit_image_get_load(fit, node, &load_addr)) {
> @@ -283,8 +299,7 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
>   			return 0;
>   		}
>   
> -		if (spl_decompression_enabled() &&
> -		    (image_comp == IH_COMP_GZIP || image_comp == IH_COMP_LZMA))
> +		if (image_comp != IH_COMP_NONE)
>   			src_ptr = map_sysmem(ALIGN(CONFIG_SYS_LOAD_ADDR, ARCH_DMA_MINALIGN), len);
>   		else
>   			src_ptr = map_sysmem(ALIGN(load_addr, ARCH_DMA_MINALIGN), len);

Why doesn't spl_decompression_enabled work here?

--Sean

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 3/3] spl: fit: Load compressed blob to heap buffer
  2023-11-03 14:34 ` [PATCH 3/3] spl: fit: Load compressed blob to heap buffer Loic Poulain
@ 2023-11-04 15:13   ` Sean Anderson
  0 siblings, 0 replies; 6+ messages in thread
From: Sean Anderson @ 2023-11-04 15:13 UTC (permalink / raw)
  To: Loic Poulain, sjg, marex; +Cc: u-boot, abbaraju.manojsai

On 11/3/23 10:34, Loic Poulain wrote:
> CONFIG_SYS_LOAD_ADDR is usually configured as the address where
> the kernel should be loaded at. It can be problematic to use it
> as a generic temporary buffer for FIT compressed blobs.
> 
> An example is when the image is a compressed kernel with load
> address equal to CONFIG_SYS_LOAD_ADDR, this causes (inplace)
> decompression to fail.
> 
> Instead we can simply allocate a temporary buffer in the heap
> 
> Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
> ---
>   common/spl/spl_fit.c | 16 ++++++++++------
>   1 file changed, 10 insertions(+), 6 deletions(-)
> 
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index 08428660b0..8a807db5ba 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -249,7 +249,7 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
>   	ulong size;
>   	ulong load_addr;
>   	void *load_ptr;
> -	void *src;
> +	void *src, *src_ptr;
>   	ulong overhead;
>   	int nr_sectors;
>   	uint8_t image_comp, type = -1;
> @@ -289,8 +289,6 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
>   	}
>   
>   	if (external_data) {
> -		void *src_ptr;
> -
>   		/* External data */
>   		if (fit_image_get_data_size(fit, node, &len))
>   			return -ENOENT;
> @@ -302,10 +300,13 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
>   			return 0;
>   		}
>   
> -		if (image_comp != IH_COMP_NONE)
> -			src_ptr = map_sysmem(ALIGN(CONFIG_SYS_LOAD_ADDR, ARCH_DMA_MINALIGN), len);
> -		else
> +		if (image_comp != IH_COMP_NONE) {
> +			src_ptr = malloc_cache_aligned(len + 2 * info->bl_len);
> +			if (!src_ptr)
> +				return -ENOMEM;
> +		} else {
>   			src_ptr = map_sysmem(ALIGN(load_addr, ARCH_DMA_MINALIGN), len);
> +		}
>   		length = len;
>   
>   		overhead = get_aligned_image_overhead(info, offset);
> @@ -383,6 +384,9 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
>   			image_info->entry_point = FDT_ERROR;
>   	}
>   
> +	if (external_data && image_comp != IH_COMP_NONE)
> +		free(src_ptr);
> +
>   	return 0;
>   }
>   

Why not use spl_simple_fit_read?

--Sean

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/3] spl: fit: Add support for LZO compressed images
  2023-11-03 14:34 ` [PATCH 2/3] spl: fit: Add support for LZO compressed images Loic Poulain
@ 2023-11-04 15:19   ` Sean Anderson
  0 siblings, 0 replies; 6+ messages in thread
From: Sean Anderson @ 2023-11-04 15:19 UTC (permalink / raw)
  To: Loic Poulain, sjg, marex; +Cc: u-boot, abbaraju.manojsai

On 11/3/23 10:34, Loic Poulain wrote:
> Signed-off-by: Loic Poulain <loic.poulain@linaro.org>

Please add an appropriate commit message.

> ---
>   common/spl/spl_fit.c | 10 ++++++++++
>   include/spl.h        |  4 +++-
>   2 files changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index 1d42cb1d10..08428660b0 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -18,6 +18,7 @@
>   #include <asm/global_data.h>
>   #include <asm/io.h>
>   #include <linux/libfdt.h>
> +#include <linux/lzo.h>
>   #include <linux/printk.h>
>   
>   DECLARE_GLOBAL_DATA_PTR;
> @@ -215,6 +216,8 @@ static inline bool spl_fit_decompression_supported(uint8_t comp)
>   		return IS_ENABLED(CONFIG_SPL_GZIP);
>   	case IH_COMP_LZMA:
>   		return IS_ENABLED(CONFIG_SPL_LZMA);
> +	case IH_COMP_LZO:
> +		return IS_ENABLED(CONFIG_SPL_LZO);
>   	case IH_COMP_NONE:
>   		return true;
>   	}
> @@ -357,6 +360,13 @@ static int load_simple_fit(struct spl_load_info *info, ulong sector,
>   			return -EIO;
>   		}
>   		length = loadEnd - CONFIG_SYS_LOAD_ADDR;
> +	} else if (IS_ENABLED(CONFIG_SPL_LZO) && image_comp == IH_COMP_LZO) {
> +		size = CONFIG_SYS_BOOTM_LEN;
> +		if (lzop_decompress(src, length, load_ptr, &size)) {
> +			puts("Uncompressing error\n");
> +			return -EIO;
> +		}
> +		length = size;
>   	} else {
>   		memcpy(load_ptr, src, length);
>   	}
> diff --git a/include/spl.h b/include/spl.h
> index 8ff20adc28..e07092372a 100644
> --- a/include/spl.h
> +++ b/include/spl.h
> @@ -1016,6 +1016,8 @@ int spl_load_fit_image(struct spl_image_info *spl_image,
>    */
>   static inline bool spl_decompression_enabled(void)
>   {
> -	return IS_ENABLED(CONFIG_SPL_GZIP) || IS_ENABLED(CONFIG_SPL_LZMA);
> +	return IS_ENABLED(CONFIG_SPL_GZIP) || IS_ENABLED(CONFIG_SPL_LZMA) ||
> +		IS_ENABLED(CONFIG_SPL_LZO);
>   }
> +
>   #endif

Please also add a decompression test. I think spl_test_image should be extended to
test all decompression types (see do_spl_test_load for inspiration). do_spl_test_load
should also be extended to test LZMA FITs.

--Sean

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-11-04 15:19 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-11-03 14:34 [PATCH 1/3] spl: fit: Discard decompression if not supported Loic Poulain
2023-11-03 14:34 ` [PATCH 2/3] spl: fit: Add support for LZO compressed images Loic Poulain
2023-11-04 15:19   ` Sean Anderson
2023-11-03 14:34 ` [PATCH 3/3] spl: fit: Load compressed blob to heap buffer Loic Poulain
2023-11-04 15:13   ` Sean Anderson
2023-11-04 15:10 ` [PATCH 1/3] spl: fit: Discard decompression if not supported Sean Anderson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox