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

2021-10-05 Thread Patrick DELAUNAY

Hi,

On 10/5/21 3:41 PM, patrick.delau...@foss.st.com wrote:

Hi,


ST Restricted


-Original Message-
From: Marek Vasut 
Sent: mardi 5 octobre 2021 15:33
To: patrick.delau...@foss.st.com; u-boot@lists.denx.de
Cc: 'Lukasz Majewski' 
Subject: Re: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes

On 10/5/21 2:50 PM, patrick.delau...@foss.st.com wrote:

Hi Marek,


ST Restricted


-Original Message-
From: U-Boot  On Behalf Of Marek Vasut
Sent: mardi 5 octobre 2021 14:40
To: u-boot@lists.denx.de
Cc: Marek Vasut ; Lukasz Majewski 
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 
Cc: Lukasz Majewski 
---
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(, " ");
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++;
dfu->data.sf.size = hextoul(s, );
+   } else if (!strcmp(st, "sf")) {
+   st = strsep(, " ");
+   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, );
@@ -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"

Does it work for multiple SPI NORs at the same time ?

If it is support on mtd side, yes it is supported in dfu...

And I think it is supported now (with u-class UCLASS_SPI_FLASH).
I need to check.deeper

Patrick


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  0:1=raw 0x0 "

'&' 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


Test with dfu MTD backend + export of all device present on STM32MP157C-EV1


dfu_alt_info=ram 0=uImage ram 0xc200 0x200;devicetree.dtb ram 
0xc400 0x10;uramdisk.image.gz ram 0xc440 0x1000 
0=mmc0_fsbl1 part 0 1;mmc0_fsbl2 part 0 2;m

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

2021-10-05 Thread patrick.delaunay
Hi,


ST Restricted

> -Original Message-
> From: Marek Vasut 
> Sent: mardi 5 octobre 2021 15:33
> To: patrick.delau...@foss.st.com; u-boot@lists.denx.de
> Cc: 'Lukasz Majewski' 
> Subject: Re: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
> 
> On 10/5/21 2:50 PM, patrick.delau...@foss.st.com wrote:
> > Hi Marek,
> >
> >
> > ST Restricted
> >
> >> -Original Message-
> >> From: U-Boot  On Behalf Of Marek Vasut
> >> Sent: mardi 5 octobre 2021 14:40
> >> To: u-boot@lists.denx.de
> >> Cc: Marek Vasut ; Lukasz Majewski 
> >> 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 
> >> Cc: Lukasz Majewski 
> >> ---
> >> 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(, " ");
> >>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++;
> >>dfu->data.sf.size = hextoul(s, );
> >> +  } else if (!strcmp(st, "sf")) {
> >> +  st = strsep(, " ");
> >> +  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, );
> >> @@ -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"
> 
> Does it work for multiple SPI NORs at the same time ?

If it is support on mtd side, yes it is supported in dfu...

And I think it is supported now (with u-class UCLASS_SPI_FLASH).
I need to check.deeper

Patrick



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

2021-10-05 Thread Marek Vasut

On 10/5/21 2:50 PM, patrick.delau...@foss.st.com wrote:

Hi Marek,


ST Restricted


-Original Message-
From: U-Boot  On Behalf Of Marek Vasut
Sent: mardi 5 octobre 2021 14:40
To: u-boot@lists.denx.de
Cc: Marek Vasut ; Lukasz Majewski 
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 
Cc: Lukasz Majewski 
---
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(, " ");
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++;
dfu->data.sf.size = hextoul(s, );
+   } else if (!strcmp(st, "sf")) {
+   st = strsep(, " ");
+   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, );
@@ -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"


Does it work for multiple SPI NORs at the same time ?


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

2021-10-05 Thread patrick.delaunay
Hi,


ST Restricted

> -Original Message-
> From: patrick.delau...@foss.st.com 
> Sent: mardi 5 octobre 2021 14:50
> To: 'Marek Vasut' ; 'u-boot@lists.denx.de'  b...@lists.denx.de>
> Cc: 'Lukasz Majewski' 
> Subject: RE: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
> 
> Hi Marek,
> 
> 
> ST Restricted
> 
> > -Original Message-
> > From: U-Boot  On Behalf Of Marek Vasut
> > Sent: mardi 5 octobre 2021 14:40
> > To: u-boot@lists.denx.de
> > Cc: Marek Vasut ; Lukasz Majewski 
> > 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 
> > Cc: Lukasz Majewski 
> > ---
> > 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(, " ");
> > 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++;
> > dfu->data.sf.size = hextoul(s, );
> > +   } else if (!strcmp(st, "sf")) {
> > +   st = strsep(, " ");
> > +   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, );
> > @@ -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  0:1=raw 0x0 "

'&' 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



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

2021-10-05 Thread patrick.delaunay
Hi Marek,


ST Restricted

> -Original Message-
> From: U-Boot  On Behalf Of Marek Vasut
> Sent: mardi 5 octobre 2021 14:40
> To: u-boot@lists.denx.de
> Cc: Marek Vasut ; Lukasz Majewski 
> 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 
> Cc: Lukasz Majewski 
> ---
> 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(, " ");
>   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++;
>   dfu->data.sf.size = hextoul(s, );
> + } else if (!strcmp(st, "sf")) {
> + st = strsep(, " ");
> + 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, );
> @@ -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"



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

2021-10-05 Thread Marek Vasut
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 
Cc: Lukasz Majewski 
---
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(, " ");
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++;
dfu->data.sf.size = hextoul(s, );
+   } else if (!strcmp(st, "sf")) {
+   st = strsep(, " ");
+   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, );
@@ -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