[U-Boot] [PATCH 4/5] cmd: mvebu: bubt: Add support for legacy Marvell SoCs
Stefan Roese
sr at denx.de
Wed Sep 19 13:13:05 UTC 2018
On 29.08.2018 15:34, kostap at marvell.com wrote:
> From: Konstantin Porotchkin <kostap at marvell.com>
>
> Add support for image load and basic verification in bubt
> for legacy Marvell SoCs (A38x, A39x, ...)
>
> Signed-off-by: Konstantin Porotchkin <kostap at marvell.com>
> Cc: Igal Liberman <igall at marvell.com>
> Cc: Stefan Roese <sr at denx.de>
> ---
> cmd/mvebu/bubt.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 72 insertions(+), 3 deletions(-)
>
> diff --git a/cmd/mvebu/bubt.c b/cmd/mvebu/bubt.c
> index b4d371f..e10d079 100644
> --- a/cmd/mvebu/bubt.c
> +++ b/cmd/mvebu/bubt.c
> @@ -83,6 +83,33 @@ struct mvebu_image_info {
> u32 encrypt_start_offset;
> u32 encrypt_size;
> };
> +
> +#else /* Older Armada SoCs - A38x, A39x, ... */
> +
> +#define LEGACY_HDR_VERSION 1
> +
> +struct legacy_image_header {
> +/* type name byte order */
> + u8 block_id; /* 0 */
> + u8 flags; /* 1 */
> + u16 nand_pge_size; /* 2-3 */
> + u32 block_size; /* 4-7 */
> + u8 version; /* 8 */
> + u8 hdr_size_msb; /* 9 */
> + u16 hdr_size_lsb; /* 10-11 */
> + u32 source_addr; /* 12-15 */
> + u32 destination_addr; /* 16-19 */
> + u32 execution_addr; /* 20-23 */
> + u8 options; /* 24 */
> + u8 nand_block_size; /* 25 */
> + u8 nand_technology; /* 26 */
> + u8 rsvd4; /* 27 */
> + u16 rsvd2; /* 28-29 */
> + u8 ext; /* 30 */
> + u8 checksum; /* 31 */
> +
> +};
> +
> #endif /* CONFIG_ARMADA_XXX */
>
> struct bubt_dev {
> @@ -618,11 +645,53 @@ static int check_image_header(void)
> return 0;
> }
>
> -#else /* Not ARMADA? */
> +#else /* Legacy SoCs */
> +u8 do_checksum8(u8 *start, u32 len)
> +{
> + u8 sum = 0;
> + u8 *startp = start;
> +
> + do {
> + sum += *startp;
> + startp++;
> + } while (--len);
> +
> + return sum;
> +}
> +
> static int check_image_header(void)
> {
> - printf("bubt cmd does not support this SoC device or family!\n");
> - return -ENOEXEC;
> + struct legacy_image_header *hdr =
> + (struct legacy_image_header *)get_load_addr();
> + u32 header_len = hdr->hdr_size_lsb + (hdr->hdr_size_msb << 16);
> + u8 checksum;
> + u8 checksum_ref = hdr->checksum;
> +
> + /*
> + * For now compare checksum, and header version. Later we can
> + * verify more stuff on the header like interface type, etc
> + */
> + if (hdr->version != LEGACY_HDR_VERSION) {
> + printf("ERROR: Bad HDR Version 0x%x != 0x%x\n",
> + hdr->version, LEGACY_HDR_VERSION);
> + return -ENOEXEC;
> + }
> +
> + /* The checksum value is discarded from checksum calculation */
> + hdr->checksum = 0;
> +
> + checksum = do_checksum8((u8 *)hdr, header_len);
> + if (checksum != checksum_ref) {
> + printf("Error: Bad Image checksum. 0x%x != 0x%x\n",
> + checksum, checksum_ref);
> + return -ENOEXEC;
> + }
> +
> + /* Restore the checksum before writing */
> + hdr->checksum = checksum_ref;
> + printf("Image checksum...OK!\n");
> +
> + return 0;
> }
> #endif
>
>
Dropped for now, as a result of your discussion in this thread.
Thanks,
Stefan
More information about the U-Boot
mailing list