All of lore.kernel.org
 help / color / mirror / Atom feed
* [u-boot][PATCH] spl: spl_legacy: Fix NAND boot on OMAP3 BeagleBoard
@ 2022-09-29 10:11 Roger Quadros
  2022-10-10 10:38 ` Roger Quadros
  0 siblings, 1 reply; 4+ messages in thread
From: Roger Quadros @ 2022-09-29 10:11 UTC (permalink / raw)
  To: trini; +Cc: tony, gadiyar, u-boot, Roger Quadros

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 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>
---
 common/spl/spl_legacy.c | 19 ++++++++-----------
 common/spl/spl_nand.c   |  2 +-
 common/spl/spl_nor.c    |  6 +++++-
 include/spl.h           |  7 +++++--
 4 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/common/spl/spl_legacy.c b/common/spl/spl_legacy.c
index ae8731c782..2e9226c990 100644
--- a/common/spl/spl_legacy.c
+++ b/common/spl/spl_legacy.c
@@ -77,32 +77,29 @@ static inline int spl_image_get_comp(const struct image_header *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 image_header *hdr)
 {
 	__maybe_unused SizeT lzma_len;
 	__maybe_unused void *src;
-	struct image_header 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;
 	}
 
diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
index 7b7579a2df..5eb67b5468 100644
--- a/common/spl/spl_nand.c
+++ b/common/spl/spl_nand.c
@@ -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)
diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c
index 7986e930d2..f00a5c395b 100644
--- a/common/spl/spl_nor.c
+++ b/common/spl/spl_nor.c
@@ -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 image_header 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;
diff --git a/include/spl.h b/include/spl.h
index aac6648f94..7fa5e51c39 100644
--- a/include/spl.h
+++ b/include/spl.h
@@ -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 image_header *hdr);
+
 
 /**
  * spl_load_imx_container() - Loads a imx container image from a device.
-- 
2.17.1


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

* Re: [u-boot][PATCH] spl: spl_legacy: Fix NAND boot on OMAP3 BeagleBoard
  2022-09-29 10:11 [u-boot][PATCH] spl: spl_legacy: Fix NAND boot on OMAP3 BeagleBoard Roger Quadros
@ 2022-10-10 10:38 ` Roger Quadros
  2022-10-26  6:30   ` Michael Nazzareno Trimarchi
  0 siblings, 1 reply; 4+ messages in thread
From: Roger Quadros @ 2022-10-10 10:38 UTC (permalink / raw)
  To: trini, Dario Binacchi; +Cc: tony, gadiyar, u-boot

+Dario

On 29/09/2022 13:11, Roger Quadros wrote:
> 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 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>
> ---
>  common/spl/spl_legacy.c | 19 ++++++++-----------
>  common/spl/spl_nand.c   |  2 +-
>  common/spl/spl_nor.c    |  6 +++++-
>  include/spl.h           |  7 +++++--
>  4 files changed, 19 insertions(+), 15 deletions(-)
> 
> diff --git a/common/spl/spl_legacy.c b/common/spl/spl_legacy.c
> index ae8731c782..2e9226c990 100644
> --- a/common/spl/spl_legacy.c
> +++ b/common/spl/spl_legacy.c
> @@ -77,32 +77,29 @@ static inline int spl_image_get_comp(const struct image_header *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 image_header *hdr)
>  {
>  	__maybe_unused SizeT lzma_len;
>  	__maybe_unused void *src;
> -	struct image_header 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;
>  	}
>  
> diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
> index 7b7579a2df..5eb67b5468 100644
> --- a/common/spl/spl_nand.c
> +++ b/common/spl/spl_nand.c
> @@ -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)
> diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c
> index 7986e930d2..f00a5c395b 100644
> --- a/common/spl/spl_nor.c
> +++ b/common/spl/spl_nor.c
> @@ -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 image_header 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;
> diff --git a/include/spl.h b/include/spl.h
> index aac6648f94..7fa5e51c39 100644
> --- a/include/spl.h
> +++ b/include/spl.h
> @@ -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 image_header *hdr);
> +
>  
>  /**
>   * spl_load_imx_container() - Loads a imx container image from a device.

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

* Re: [u-boot][PATCH] spl: spl_legacy: Fix NAND boot on OMAP3 BeagleBoard
  2022-10-10 10:38 ` Roger Quadros
@ 2022-10-26  6:30   ` Michael Nazzareno Trimarchi
  2022-10-26 13:51     ` Tom Rini
  0 siblings, 1 reply; 4+ messages in thread
From: Michael Nazzareno Trimarchi @ 2022-10-26  6:30 UTC (permalink / raw)
  To: Roger Quadros; +Cc: trini, Dario Binacchi, tony, gadiyar, u-boot

Hi Roger

On Mon, Oct 10, 2022 at 12:38 PM Roger Quadros <rogerq@kernel.org> wrote:
>
> +Dario
>
> On 29/09/2022 13:11, Roger Quadros wrote:
> > 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 read here by simply passing around
> > the pointer to the header.
> >
> > This fixes NAND boot on OMAP3 BeagleBoard.
> >

I can see that fix is only a collateral effect of reduce the
allocation on this scenario.

I think that is better to mention as it. So the real change is to
avoid to allocate two times
mostly

Reviewed-By: Michael Trimarchi <michael@amarulasolutions.com>

> > Signed-off-by: Roger Quadros <rogerq@kernel.org>
> > ---
> >  common/spl/spl_legacy.c | 19 ++++++++-----------
> >  common/spl/spl_nand.c   |  2 +-
> >  common/spl/spl_nor.c    |  6 +++++-
> >  include/spl.h           |  7 +++++--
> >  4 files changed, 19 insertions(+), 15 deletions(-)
> >
> > diff --git a/common/spl/spl_legacy.c b/common/spl/spl_legacy.c
> > index ae8731c782..2e9226c990 100644
> > --- a/common/spl/spl_legacy.c
> > +++ b/common/spl/spl_legacy.c
> > @@ -77,32 +77,29 @@ static inline int spl_image_get_comp(const struct image_header *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 image_header *hdr)
> >  {
> >       __maybe_unused SizeT lzma_len;
> >       __maybe_unused void *src;
> > -     struct image_header 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;
> >       }
> >
> > diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
> > index 7b7579a2df..5eb67b5468 100644
> > --- a/common/spl/spl_nand.c
> > +++ b/common/spl/spl_nand.c
> > @@ -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)
> > diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c
> > index 7986e930d2..f00a5c395b 100644
> > --- a/common/spl/spl_nor.c
> > +++ b/common/spl/spl_nor.c
> > @@ -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 image_header 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;
> > diff --git a/include/spl.h b/include/spl.h
> > index aac6648f94..7fa5e51c39 100644
> > --- a/include/spl.h
> > +++ b/include/spl.h
> > @@ -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 image_header *hdr);
> > +
> >
> >  /**
> >   * spl_load_imx_container() - Loads a imx container image from a device.



-- 
Michael Nazzareno Trimarchi
Co-Founder & Chief Executive Officer
M. +39 347 913 2170
michael@amarulasolutions.com
__________________________________

Amarula Solutions BV
Joop Geesinkweg 125, 1114 AB, Amsterdam, NL
T. +31 (0)85 111 9172
info@amarulasolutions.com
www.amarulasolutions.com

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

* Re: [u-boot][PATCH] spl: spl_legacy: Fix NAND boot on OMAP3 BeagleBoard
  2022-10-26  6:30   ` Michael Nazzareno Trimarchi
@ 2022-10-26 13:51     ` Tom Rini
  0 siblings, 0 replies; 4+ messages in thread
From: Tom Rini @ 2022-10-26 13:51 UTC (permalink / raw)
  To: Michael Nazzareno Trimarchi
  Cc: Roger Quadros, Dario Binacchi, tony, gadiyar, u-boot

[-- Attachment #1: Type: text/plain, Size: 1083 bytes --]

On Wed, Oct 26, 2022 at 08:30:40AM +0200, Michael Nazzareno Trimarchi wrote:
> Hi Roger
> 
> On Mon, Oct 10, 2022 at 12:38 PM Roger Quadros <rogerq@kernel.org> wrote:
> >
> > +Dario
> >
> > On 29/09/2022 13:11, Roger Quadros wrote:
> > > 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 read here by simply passing around
> > > the pointer to the header.
> > >
> > > This fixes NAND boot on OMAP3 BeagleBoard.
> > >
> 
> I can see that fix is only a collateral effect of reduce the
> allocation on this scenario.
> 
> I think that is better to mention as it. So the real change is to
> avoid to allocate two times
> mostly
> 
> Reviewed-By: Michael Trimarchi <michael@amarulasolutions.com>

Since I was about to push this out, is it OK to go with this commit
message as-is or should I reword it, if Roger doesn't shortly? Thanks.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

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

end of thread, other threads:[~2022-10-26 13:51 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-29 10:11 [u-boot][PATCH] spl: spl_legacy: Fix NAND boot on OMAP3 BeagleBoard Roger Quadros
2022-10-10 10:38 ` Roger Quadros
2022-10-26  6:30   ` Michael Nazzareno Trimarchi
2022-10-26 13:51     ` Tom Rini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.