[U-Boot,V4,1/2] ARM: image: Add option for ignoring ep bit 3

Message ID 20180613041333.17943-1-marek.vasut+renesas@gmail.com
State Accepted
Commit 7f13b374fd8fa59f694a1127a79f9bfc3891ef0d
Delegated to: Tom Rini
Headers show
Series
  • [U-Boot,V4,1/2] ARM: image: Add option for ignoring ep bit 3
Related show

Commit Message

Marek Vasut June 13, 2018, 4:13 a.m.
Add option to the booti_setup() which indicates to it that the caller
requires the image to be relocated to the beginning of the RAM and
that the information whether the image can be located anywhere in RAM
at 2 MiB aligned boundary or not is to be ignored. This is useful ie.
in case the Image is wrapped in another envelope, ie. fitImage and not
relocating it but moving it would corrupt the envelope.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Bin Chen <bin.chen@linaro.org>
Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Tom Rini <trini@konsulko.com>
---
V2: Rename ignore_ep to force_reloc
V3: No change
V4: - Add stdbool.h include
    - Switch force_reloc to bool
---
 arch/arm/lib/image.c | 5 +++--
 cmd/booti.c          | 2 +-
 include/image.h      | 5 ++++-
 3 files changed, 8 insertions(+), 4 deletions(-)

Comments

Bin Chen June 13, 2018, 7:24 a.m. | #1
On 13 June 2018 at 14:13, Marek Vasut <marek.vasut@gmail.com> wrote:

> Add option to the booti_setup() which indicates to it that the caller
> requires the image to be relocated to the beginning of the RAM and
> that the information whether the image can be located anywhere in RAM
> at 2 MiB aligned boundary or not is to be ignored. This is useful ie.
> in case the Image is wrapped in another envelope, ie. fitImage and not
> relocating it but moving it would corrupt the envelope.
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
> Cc: Bin Chen <bin.chen@linaro.org>
> Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
> Cc: Tom Rini <trini@konsulko.com>
> ---
> V2: Rename ignore_ep to force_reloc
> V3: No change
> V4: - Add stdbool.h include
>     - Switch force_reloc to bool
> ---
>  arch/arm/lib/image.c | 5 +++--
>  cmd/booti.c          | 2 +-
>  include/image.h      | 5 ++++-
>  3 files changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/lib/image.c b/arch/arm/lib/image.c
> index 1a04e2b875..699bf44e70 100644
> --- a/arch/arm/lib/image.c
> +++ b/arch/arm/lib/image.c
> @@ -26,7 +26,8 @@ struct Image_header {
>         uint32_t        res5;
>  };
>
> -int booti_setup(ulong image, ulong *relocated_addr, ulong *size)
> +int booti_setup(ulong image, ulong *relocated_addr, ulong *size,
> +               bool force_reloc)
>  {
>         struct Image_header *ih;
>         uint64_t dst;
> @@ -63,7 +64,7 @@ int booti_setup(ulong image, ulong *relocated_addr,
> ulong *size)
>          * images->ep.  Otherwise, relocate the image to the base of RAM
>          * since memory below it is not accessible via the linear mapping.
>          */
> -       if (le64_to_cpu(ih->flags) & BIT(3))
> +       if (!force_reloc && (le64_to_cpu(ih->flags) & BIT(3)))
>                 dst = image - text_offset;
>         else
>                 dst = gd->bd->bi_dram[0].start;
> diff --git a/cmd/booti.c b/cmd/booti.c
> index 45fbb99b68..04353b68ec 100644
> --- a/cmd/booti.c
> +++ b/cmd/booti.c
> @@ -37,7 +37,7 @@ static int booti_start(cmd_tbl_t *cmdtp, int flag, int
> argc,
>                 debug("*  kernel: cmdline image address = 0x%08lx\n", ld);
>         }
>
> -       ret = booti_setup(ld, &relocated_addr, &image_size);
> +       ret = booti_setup(ld, &relocated_addr, &image_size, false);
>         if (ret != 0)
>                 return 1;
>
> diff --git a/include/image.h b/include/image.h
> index 95d5934344..420b8ff576 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -17,6 +17,7 @@
>
>  #include "compiler.h"
>  #include <asm/byteorder.h>
> +#include <stdbool.h>
>
>  /* Define this to avoid #ifdefs later on */
>  struct lmb;
> @@ -881,9 +882,11 @@ int bootz_setup(ulong image, ulong *start, ulong
> *end);
>   * @image: Address of image
>   * @start: Returns start address of image
>   * @size : Returns size image
> + * @force_reloc: Ignore image->ep field, always place image to RAM start
>   * @return 0 if OK, 1 if the image was not recognised
>   */
> -int booti_setup(ulong image, ulong *relocated_addr, ulong *size);
> +int booti_setup(ulong image, ulong *relocated_addr, ulong *size,
> +               bool force_reloc);
>
>  /*******************************************************************/
>  /* New uImage format specific code (prefixed with fit_) */
>

Reviewed-By: Bin Chen <bin.chen@linaro.org>


> --
> 2.17.1
>
>
Tom Rini June 19, 2018, 6:42 p.m. | #2
On Wed, Jun 13, 2018 at 06:13:32AM +0200, Marek Vasut wrote:

> Add option to the booti_setup() which indicates to it that the caller
> requires the image to be relocated to the beginning of the RAM and
> that the information whether the image can be located anywhere in RAM
> at 2 MiB aligned boundary or not is to be ignored. This is useful ie.
> in case the Image is wrapped in another envelope, ie. fitImage and not
> relocating it but moving it would corrupt the envelope.
> 
> Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
> Cc: Bin Chen <bin.chen@linaro.org>
> Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
> Cc: Tom Rini <trini@konsulko.com>
> Reviewed-By: Bin Chen <bin.chen@linaro.org>

Applied to u-boot/master, thanks!

Patch

diff --git a/arch/arm/lib/image.c b/arch/arm/lib/image.c
index 1a04e2b875..699bf44e70 100644
--- a/arch/arm/lib/image.c
+++ b/arch/arm/lib/image.c
@@ -26,7 +26,8 @@  struct Image_header {
 	uint32_t	res5;
 };
 
-int booti_setup(ulong image, ulong *relocated_addr, ulong *size)
+int booti_setup(ulong image, ulong *relocated_addr, ulong *size,
+		bool force_reloc)
 {
 	struct Image_header *ih;
 	uint64_t dst;
@@ -63,7 +64,7 @@  int booti_setup(ulong image, ulong *relocated_addr, ulong *size)
 	 * images->ep.  Otherwise, relocate the image to the base of RAM
 	 * since memory below it is not accessible via the linear mapping.
 	 */
-	if (le64_to_cpu(ih->flags) & BIT(3))
+	if (!force_reloc && (le64_to_cpu(ih->flags) & BIT(3)))
 		dst = image - text_offset;
 	else
 		dst = gd->bd->bi_dram[0].start;
diff --git a/cmd/booti.c b/cmd/booti.c
index 45fbb99b68..04353b68ec 100644
--- a/cmd/booti.c
+++ b/cmd/booti.c
@@ -37,7 +37,7 @@  static int booti_start(cmd_tbl_t *cmdtp, int flag, int argc,
 		debug("*  kernel: cmdline image address = 0x%08lx\n", ld);
 	}
 
-	ret = booti_setup(ld, &relocated_addr, &image_size);
+	ret = booti_setup(ld, &relocated_addr, &image_size, false);
 	if (ret != 0)
 		return 1;
 
diff --git a/include/image.h b/include/image.h
index 95d5934344..420b8ff576 100644
--- a/include/image.h
+++ b/include/image.h
@@ -17,6 +17,7 @@ 
 
 #include "compiler.h"
 #include <asm/byteorder.h>
+#include <stdbool.h>
 
 /* Define this to avoid #ifdefs later on */
 struct lmb;
@@ -881,9 +882,11 @@  int bootz_setup(ulong image, ulong *start, ulong *end);
  * @image: Address of image
  * @start: Returns start address of image
  * @size : Returns size image
+ * @force_reloc: Ignore image->ep field, always place image to RAM start
  * @return 0 if OK, 1 if the image was not recognised
  */
-int booti_setup(ulong image, ulong *relocated_addr, ulong *size);
+int booti_setup(ulong image, ulong *relocated_addr, ulong *size,
+		bool force_reloc);
 
 /*******************************************************************/
 /* New uImage format specific code (prefixed with fit_) */