[U-Boot] [PATCH] sunxi: (mksunxiboot) signature to indicate "sunxi" SPL variant

Siarhei Siamashka siarhei.siamashka at gmail.com
Wed Sep 2 16:51:34 CEST 2015


On Wed,  2 Sep 2015 15:17:11 +0200
Bernhard Nortmann <bernhard.nortmann at web.de> wrote:

> This patch follows up on a discussion of ways to improve support
> for the sunxi FEL ("USB boot") mechanism, especially with regard
> to boot scripts, see:
> https://groups.google.com/d/msg/linux-sunxi/wBEGUoLNRro/rHGq6nSYCQAJ
> 
> The idea is to convert the (currently unused) "pad" bytes in the
> SPL header into an area where data can be passed to U-Boot. To
> do this safely, we have to make sure that we're actually using
> our "sunxi" flavor of the SPL, and not the Allwinner boot0.
> 
> The modified mksunxiboot introduces a special signature to the
> SPL header in place of the "pub_head_size" field. This can be
> used to reliably distinguish between compatible versions of sunxi
> SPL and anything else (older variants or Allwinner's boot0).
> 
> Signed-off-by: Bernhard Nortmann <bernhard.nortmann at web.de>

Thanks for starting the work on improving this stuff.

Do I understand it right that this patch is supposed to be a part of
a bigger set, implementing some useful functionality in U-Boot?
Probably it would be best if these patches are submitted, reviewed
and applied together.

> ---
> 
>  tools/mksunxiboot.c | 27 ++++++++++++++++++++++++++-
>  1 file changed, 26 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/mksunxiboot.c b/tools/mksunxiboot.c
> index 3361251..58bc5c7 100644
> --- a/tools/mksunxiboot.c
> +++ b/tools/mksunxiboot.c
> @@ -27,12 +27,31 @@ struct boot_file_head {
>  	 * by the boot ROM. To be compatible with Allwinner tools we
>  	 * would need to implement the proper fields here instead of
>  	 * padding.
> +	 *
> +	 * Actually we want the ability to recognize our "sunxi" variant
> +	 * of the SPL. To do so, let's place a special signature into the
> +	 * "pub_head_size" field. We can reasonably expect Allwinner's
> +	 * boot0 to always have the upper 16 bits of this set to 0 (after
> +	 * all the value shouldn't be larger than the limit imposed by
> +	 * SRAM size).
> +	 * If the signature is present (at 0x14), then we know it's safe
> +	 * to use the remaining 8 bytes (at 0x18) for our own purposes.
> +	 * (E.g. sunxi-tools "fel" utility can pass information there.)
> +	 *
> +	 * The overall header size still sums up to 32 bytes.
>  	 */
> -	uint8_t pad[12];		/* align to 32 bytes */
> +	union {
> +		uint32_t pub_head_size;
> +		uint8_t spl_signature[4];
> +	};
> +	uint32_t fel_data_address;
> +	uint32_t fel_data_size;

Do these new fields imply that the actual fel data is supposed to
be stored in some other place? We may have troubles finding/allocating
this other place in such a way that it does not clash with anything
else.

If you need more space in the SPL header for the fel data, then it can
be easily increased from 32 bytes to something bigger. In order to do
this, we can change CONFIG_SPL_TEXT_BASE in
    http://git.denx.de/?p=u-boot.git;a=blob;f=include/configs/sunxi-common.h;h=1abf73c311792b21f2fa40857b5f11e43fbd76cc#l203
and update the first branch instruction in the SPL header.

But I thought that we initially only wanted to have something like this
at the end of the SPL header:

    uint32_t bootscript_address;
    uint8_t  pad[4];

Where the 'bootscript_address' would be a pointer to the 'boot.scr'
data, uploaded by the 'fel' tool to DRAM after executing the SPL
and before executing the main U-Boot part.

>  };
>  
>  #define BOOT0_MAGIC                     "eGON.BT0"
>  #define STAMP_VALUE                     0x5F0A6C39
> +#define SPL_SIGNATURE			"SPL" /* marks "sunxi" header */
> +#define SPL_HEADER_VERSION		1
>  
>  /* check sum functon from sun4i boot code */
>  int gen_check_sum(struct boot_file_head *head_p)
> @@ -133,6 +152,12 @@ int main(int argc, char *argv[])
>  		ALIGN(file_size + sizeof(struct boot_file_head), BLOCK_SIZE);
>  	img.header.b_instruction = cpu_to_le32(img.header.b_instruction);
>  	img.header.length = cpu_to_le32(img.header.length);
> +
> +	memcpy(img.header.spl_signature, SPL_SIGNATURE, 3); /* "sunxi" marker */
> +	img.header.spl_signature[3] = SPL_HEADER_VERSION;
> +	img.header.fel_data_address = 0; /* ensure fields are zeroed */
> +	img.header.fel_data_size = 0;
> +
>  	gen_check_sum(&img.header);
>  
>  	count = write(fd_out, &img, le32_to_cpu(img.header.length));

-- 
Best regards,
Siarhei Siamashka


More information about the U-Boot mailing list