[U-Boot] [EXT] Re: [PATCH 4/5] cmd: mvebu: bubt: Add support for legacy Marvell SoCs

Kostya Porotchkin kostap at marvell.com
Wed Aug 29 14:34:22 UTC 2018


Hi, Jon,

> -----Original Message-----
> From: Jon Nettleton <jon at solid-run.com>
> Sent: Wednesday, August 29, 2018 17:28
> To: Kostya Porotchkin <kostap at marvell.com>
> Cc: U-Boot Mailing List <u-boot at lists.denx.de>; Stefan Roese <sr at denx.de>
> Subject: [EXT] Re: [U-Boot] [PATCH 4/5] cmd: mvebu: bubt: Add support for
> legacy Marvell SoCs
> 
> External Email
> 
> ----------------------------------------------------------------------
> 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.
[KP] No problem, we will ask Stefan to keep this patch aside and take yours.
I made this change for handling my own tests - it was just handy to use single command for image burning.
> 
> 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.
[KP] Sure, no problem. The main reason for this patch series is a fix to broken A38x-GP platform.
If you have better "bubt", let's use it!
> 
> Thanks,
> Jon


More information about the U-Boot mailing list