RE: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes

patrick.delaunay
2021-10-05T13:01:30Z

> From: patrick.delaunay@foss.st.com <patrick.delaunay@foss.st.com>
> Sent: mardi 5 octobre 2021 14:50
> To: 'Marek Vasut' <marex@denx.de>; 'u-boot@lists.denx.de' <u-
> boot@lists.denx.de>
> Cc: 'Lukasz Majewski' <lukma@denx.de>
> Subject: RE: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
>
> Hi Marek,
>
>
> ST Restricted
>
> > -----Original Message-----
> > From: U-Boot <u-boot-bounces@lists.denx.de> On Behalf Of Marek Vasut
> > Sent: mardi 5 octobre 2021 14:40
> > To: u-boot@lists.denx.de
> > Cc: Marek Vasut <marex@denx.de>; Lukasz Majewski <lukma@denx.de>
> > Subject: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
> >
> > Add dfu_alt_info option which allows specifying multiple SPI flashes as
an alt
> info.
> > The syntax is as follows:
> >
> > altname sf bus:cs[:speed[:mode]]
> >
> > Example:
> > dfu_alt_info=qspi0 sf 0:0;qspi1 sf 0:1
> >
> > Signed-off-by: Marek Vasut <marex@denx.de>
> > Cc: Lukasz Majewski <lukma@denx.de>
> > ---
> > V2: Fix device string parsing in all cases
> > ---
> > drivers/dfu/dfu_sf.c | 31 ++++++++++++++++++++++++-------
> > 1 file changed, 24 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/dfu/dfu_sf.c b/drivers/dfu/dfu_sf.c index
> > b72493ced86..6d33497990a 100644
> > --- a/drivers/dfu/dfu_sf.c
> > +++ b/drivers/dfu/dfu_sf.c
> > @@ -168,30 +168,46 @@ static struct spi_flash *parse_dev(char *devstr)
> > int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, char *s) {
> > char *st;
> > - char *devstr_bkup = strdup(devstr);
> > -
> > - dfu->data.sf.dev = parse_dev(devstr_bkup);
> > - free(devstr_bkup);
> > - if (!dfu->data.sf.dev)
> > - return -ENODEV;
> >
> > dfu->dev_type = DFU_DEV_SF;
> > - dfu->max_buf_size = dfu->data.sf.dev->sector_size;
> >
> > st = strsep(&s, " ");
> > if (!strcmp(st, "raw")) {
> > + char *devstr_bkup = strdup(devstr);
> > + dfu->data.sf.dev = parse_dev(devstr_bkup);
> > + free(devstr_bkup);
> > + if (!dfu->data.sf.dev)
> > + return -ENODEV;
> > +
> > dfu->layout = DFU_RAW_ADDR;
> > + dfu->max_buf_size = dfu->data.sf.dev->sector_size;
> > dfu->data.sf.start = hextoul(s, &s);
> > s++;
> > dfu->data.sf.size = hextoul(s, &s);
> > + } else if (!strcmp(st, "sf")) {
> > + st = strsep(&s, " ");
> > + dfu->data.sf.dev = parse_dev(st);
> > + if (!dfu->data.sf.dev)
> > + return -ENODEV;
> > +
> > + dfu->layout = DFU_RAW_ADDR;
> > + dfu->max_buf_size = dfu->data.sf.dev->sector_size;
> > + dfu->data.sf.start = 0;
> > + dfu->data.sf.size = dfu->data.sf.dev->size;
> > } else if (CONFIG_IS_ENABLED(DFU_SF_PART) &&
> > (!strcmp(st, "part") || !strcmp(st, "partubi"))) {
> > + char *devstr_bkup = strdup(devstr);
> > char mtd_id[32];
> > struct mtd_device *mtd_dev;
> > u8 part_num;
> > struct part_info *pi;
> > int ret, dev, part;
> >
> > + dfu->data.sf.dev = parse_dev(devstr_bkup);
> > + free(devstr_bkup);
> > + if (!dfu->data.sf.dev)
> > + return -ENODEV;
> > +
> > dfu->layout = DFU_RAW_ADDR;
> >
> > dev = dectoul(s, &s);
> > @@ -208,6 +224,7 @@ int dfu_fill_entity_sf(struct dfu_entity *dfu,
> > char *devstr, char *s)
> > printf("Could not locate '%s'\n", mtd_id);
> > return -1;
> > }
> > + dfu->max_buf_size = dfu->data.sf.dev->sector_size;
> > dfu->data.sf.start = pi->offset;
> > dfu->data.sf.size = pi->size;
> > if (!strcmp(st, "partubi"))
> > --
> > 2.33.0
>
> The same use case can be supported with mtd backend
>
> https://elixir.bootlin.com/u-boot/latest/source/doc/usage/dfu.rst
>
>
> U-Boot> env set dfu_alt_info \
> "mtd nor0=spl part 1;u-boot part 2;u-boot-env part 3&"\
> "mtd nand0=UBI partubi 1"

with '&' in dfu_alt_info you can have several dfu backend...

something as (not tested) :

U-Boot> env set dfu_alt_info "sf 0:0=raw 0x0 <size>&sf 0:1=raw 0x0 <size>"

'&' It is working for ANY existing backend

=> used today in STM32MP15x
+ stm32prog command as backend when flashlayout is parsed to update any
device.
+ for dfu command (board/st/common/stm32mp_dfu.c) => all devices are
exported (mtd nand0 and mtd nor0)

Patrick