Patchwork [U-Boot,v2] tools: imximage: Load a size that is multiple of 512

login
register
mail settings
Submitter Fabio Estevam
Date Jan. 3, 2013, 6:24 p.m.
Message ID <1357237473-1401-1-git-send-email-fabio.estevam@freescale.com>
Download mbox | patch
Permalink /patch/209295/
State Awaiting Upstream
Delegated to: Stefano Babic
Headers show

Comments

Fabio Estevam - Jan. 3, 2013, 6:24 p.m.
In order to mx53 ROM to properly load the U-boot image, its header size should 
be multiple of 512 bytes.

This issue was observed with gcc 4.6.2/4.7.3, which caused data aborts:

U-Boot 2013.01-rc2-00172-gf8cfcf1-dirty (Dec 26 2012 - 13:13:28)

Board: MX53 LOCO
I2C:   ready
DRAM:  1 GiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
In:    serial
Out:   serial
Err:   serial
CPU:   Freescale i.MX53 family rev2.1 at 1000 MHz
Reset cause: WDOG
Net:   FEC
Warning: FEC using MAC address from net device

Hit any key to stop autoboot:  0
data abort

    MAYBE you should read doc/README.arm-unaligned-accesses

pc : [<aff72220>]          lr : [<aff721fc>]
sp : af565e20  ip : af566918     fp : 00000000
r10: 00000003  r9 : affabb5b     r8 : af565f58
r7 : 00000000  r6 : 36747fff     r5 : af5668e8  r4 : 36747fff
r3 : af5668ec  r2 : af5668eb     r1 : 00000000  r0 : af5668e8
Flags: NzcV  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...

resetting ...

,and this patch fixes it.

Also, even though the ROUND macro is already defined in common.h,
the reason for redefining it in image.h is explained by Stefano Babic:

"I will remark a previous comment - even if including common.h seems a
good idea to avoid duplications, it makes tools like mkimage to depend
on the selected board, because <board>_config must run. Even if this is
not a problem for us u-boot developers, it becomes an issue when these
tools are included in distros (like u-boot-tools in Ubuntu) and cannot
be packaged."

Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
---
Changes since v1:
- Improvec commit log
 include/image.h  |    3 +++
 tools/imximage.c |    9 ++++++++-
 2 files changed, 11 insertions(+), 1 deletion(-)
Dirk Behme - Jan. 4, 2013, 6:20 a.m.
On 03.01.2013 19:24, Fabio Estevam wrote:
> In order to mx53 ROM to properly load the U-boot image, its header size should 
> be multiple of 512 bytes.
> 
...
> Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
> ---
> Changes since v1:
> - Improvec commit log
>  include/image.h  |    3 +++
>  tools/imximage.c |    9 ++++++++-
>  2 files changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/include/image.h b/include/image.h
> index f54d983..e1e83b4 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -179,6 +179,9 @@
>  #define IH_MAGIC	0x27051956	/* Image Magic Number		*/
>  #define IH_NMLEN		32	/* Image Name Length		*/
>  
> +/* Reused from common.h */
> +#define ROUND(a, b)		(((a) + (b) - 1) & ~((b) - 1))
> +
>  /*
>   * Legacy format image header,
>   * all data in network byte order (aka natural aka bigendian).
> diff --git a/tools/imximage.c b/tools/imximage.c
> index 63f88b6..a93d7eb 100644
> --- a/tools/imximage.c
> +++ b/tools/imximage.c
> @@ -515,7 +515,14 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,
>  
>  	/* Set the imx header */
>  	(*set_imx_hdr)(imxhdr, dcd_len, params->ep, imxhdr->flash_offset);
> -	*header_size_ptr = sbuf->st_size + imxhdr->flash_offset;
> +
> +	/*
> +	 * ROM bug alert
> +	 * mx53 only loads 512 byte multiples.

Is this i.MX53 specific or is this valid for i.MX6, too?

Best regards

Dirk
Stefano Babic - Jan. 4, 2013, 9:03 a.m.
On 04/01/2013 07:20, Dirk Behme wrote:
> On 03.01.2013 19:24, Fabio Estevam wrote:
>> In order to mx53 ROM to properly load the U-boot image, its header
>> size should be multiple of 512 bytes.
>>

Hi Dirk,

> ...
>> Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
>> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
>> ---
>> Changes since v1:
>> - Improvec commit log
>>  include/image.h  |    3 +++
>>  tools/imximage.c |    9 ++++++++-
>>  2 files changed, 11 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/image.h b/include/image.h
>> index f54d983..e1e83b4 100644
>> --- a/include/image.h
>> +++ b/include/image.h
>> @@ -179,6 +179,9 @@
>>  #define IH_MAGIC    0x27051956    /* Image Magic Number        */
>>  #define IH_NMLEN        32    /* Image Name Length        */
>>  
>> +/* Reused from common.h */
>> +#define ROUND(a, b)        (((a) + (b) - 1) & ~((b) - 1))
>> +
>>  /*
>>   * Legacy format image header,
>>   * all data in network byte order (aka natural aka bigendian).
>> diff --git a/tools/imximage.c b/tools/imximage.c
>> index 63f88b6..a93d7eb 100644
>> --- a/tools/imximage.c
>> +++ b/tools/imximage.c
>> @@ -515,7 +515,14 @@ static void imximage_set_header(void *ptr, struct
>> stat *sbuf, int ifd,
>>  
>>      /* Set the imx header */
>>      (*set_imx_hdr)(imxhdr, dcd_len, params->ep, imxhdr->flash_offset);
>> -    *header_size_ptr = sbuf->st_size + imxhdr->flash_offset;
>> +
>> +    /*
>> +     * ROM bug alert
>> +     * mx53 only loads 512 byte multiples.
> 
> Is this i.MX53 specific or is this valid for i.MX6, too?

It seems that i.MX6 is not afflicted by this issue. For i.MX6 it adds
only some padding to the resulting image.

Best regards,
Stefano Babic
Fabio Estevam - Jan. 5, 2013, 12:08 a.m.
On Fri, Jan 4, 2013 at 7:03 AM, Stefano Babic <sbabic@denx.de> wrote:

>> Is this i.MX53 specific or is this valid for i.MX6, too?
>
> It seems that i.MX6 is not afflicted by this issue. For i.MX6 it adds
> only some padding to the resulting image.

Correct, I also tested this change on mx25/mx51/mx6 and they all boot fine.

It is safe to apply this patch into 2012.01.

Regards,

Fabio Estevam
Fabio Estevam - Jan. 5, 2013, 12:16 a.m.
On Fri, Jan 4, 2013 at 10:08 PM, Fabio Estevam <festevam@gmail.com> wrote:
> On Fri, Jan 4, 2013 at 7:03 AM, Stefano Babic <sbabic@denx.de> wrote:
>
>>> Is this i.MX53 specific or is this valid for i.MX6, too?
>>
>> It seems that i.MX6 is not afflicted by this issue. For i.MX6 it adds
>> only some padding to the resulting image.
>
> Correct, I also tested this change on mx25/mx51/mx6 and they all boot fine.
>
> It is safe to apply this patch into 2012.01.

Sorry, I meant 2013.01
Stefano Babic - Jan. 5, 2013, 5:10 p.m.
On 03/01/2013 19:24, Fabio Estevam wrote:
> In order to mx53 ROM to properly load the U-boot image, its header size should 
> be multiple of 512 bytes.
> 
> This issue was observed with gcc 4.6.2/4.7.3, which caused data aborts:
> 
> U-Boot 2013.01-rc2-00172-gf8cfcf1-dirty (Dec 26 2012 - 13:13:28)
> 
> Board: MX53 LOCO
> I2C:   ready
> DRAM:  1 GiB
> MMC:   FSL_SDHC: 0, FSL_SDHC: 1
> In:    serial
> Out:   serial
> Err:   serial
> CPU:   Freescale i.MX53 family rev2.1 at 1000 MHz
> Reset cause: WDOG
> Net:   FEC
> Warning: FEC using MAC address from net device
> 
> Hit any key to stop autoboot:  0
> data abort
> 
>     MAYBE you should read doc/README.arm-unaligned-accesses
> 
> pc : [<aff72220>]          lr : [<aff721fc>]
> sp : af565e20  ip : af566918     fp : 00000000
> r10: 00000003  r9 : affabb5b     r8 : af565f58
> r7 : 00000000  r6 : 36747fff     r5 : af5668e8  r4 : 36747fff
> r3 : af5668ec  r2 : af5668eb     r1 : 00000000  r0 : af5668e8
> Flags: NzcV  IRQs off  FIQs off  Mode SVC_32
> Resetting CPU ...
> 
> resetting ...
> 
> ,and this patch fixes it.
> 
> Also, even though the ROUND macro is already defined in common.h,
> the reason for redefining it in image.h is explained by Stefano Babic:
> 
> "I will remark a previous comment - even if including common.h seems a
> good idea to avoid duplications, it makes tools like mkimage to depend
> on the selected board, because <board>_config must run. Even if this is
> not a problem for us u-boot developers, it becomes an issue when these
> tools are included in distros (like u-boot-tools in Ubuntu) and cannot
> be packaged."
> 
> Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
> ---

Applied to u-boot-imx, thanks.

Best regards,
Stefano Babic

Patch

diff --git a/include/image.h b/include/image.h
index f54d983..e1e83b4 100644
--- a/include/image.h
+++ b/include/image.h
@@ -179,6 +179,9 @@ 
 #define IH_MAGIC	0x27051956	/* Image Magic Number		*/
 #define IH_NMLEN		32	/* Image Name Length		*/
 
+/* Reused from common.h */
+#define ROUND(a, b)		(((a) + (b) - 1) & ~((b) - 1))
+
 /*
  * Legacy format image header,
  * all data in network byte order (aka natural aka bigendian).
diff --git a/tools/imximage.c b/tools/imximage.c
index 63f88b6..a93d7eb 100644
--- a/tools/imximage.c
+++ b/tools/imximage.c
@@ -515,7 +515,14 @@  static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,
 
 	/* Set the imx header */
 	(*set_imx_hdr)(imxhdr, dcd_len, params->ep, imxhdr->flash_offset);
-	*header_size_ptr = sbuf->st_size + imxhdr->flash_offset;
+
+	/*
+	 * ROM bug alert
+	 * mx53 only loads 512 byte multiples.
+	 * The remaining fraction of a block bytes would
+	 * not be loaded.
+	 */
+	*header_size_ptr = ROUND(sbuf->st_size + imxhdr->flash_offset, 512);
 }
 
 int imximage_check_params(struct mkimage_params *params)