[U-Boot] [PATCH 4/5] cmd: mvebu: bubt: Add support for legacy Marvell SoCs
Jon Nettleton
jon at solid-run.com
Wed Aug 29 14:27:36 UTC 2018
On Wed, Aug 29, 2018 at 3:36 PM <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
>
Konstantin,
I already have a more complete integration for the legacy SOCs into
the bubt command. It incorporates much of the same code that is used
to generate the images in kwimage.c. We haven't submitted it to
mainline yet as we were waiting for a few more patchsets to land.
The features I have incorporated are supporting all possible boot
devices, image flashing from USB devices, and most importantly image
verification before flashing, so you can't brick your device by
flashing an image for eMMC onto the SPI device.
If you could take a look and comment I would be happy to work with you
to get this support into mainline.
Thanks,
Jon
More information about the U-Boot
mailing list