* [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
@ 2021-10-05 12:40 Marek Vasut
2021-10-05 12:50 ` patrick.delaunay
2021-10-05 13:01 ` patrick.delaunay
0 siblings, 2 replies; 6+ messages in thread
From: Marek Vasut @ 2021-10-05 12:40 UTC (permalink / raw)
To: u-boot; +Cc: Marek Vasut, Lukasz Majewski
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
^ permalink raw reply related [flat|nested] 6+ messages in thread
* RE: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
2021-10-05 12:40 [PATCH v2] dfu: dfu_sf: Add support for multiple flashes Marek Vasut
@ 2021-10-05 12:50 ` patrick.delaunay
2021-10-05 13:32 ` Marek Vasut
2021-10-05 13:01 ` patrick.delaunay
1 sibling, 1 reply; 6+ messages in thread
From: patrick.delaunay @ 2021-10-05 12:50 UTC (permalink / raw)
To: 'Marek Vasut', u-boot; +Cc: 'Lukasz Majewski'
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"
^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
2021-10-05 12:40 [PATCH v2] dfu: dfu_sf: Add support for multiple flashes Marek Vasut
2021-10-05 12:50 ` patrick.delaunay
@ 2021-10-05 13:01 ` patrick.delaunay
1 sibling, 0 replies; 6+ messages in thread
From: patrick.delaunay @ 2021-10-05 13:01 UTC (permalink / raw)
To: 'Marek Vasut', u-boot; +Cc: 'Lukasz Majewski'
Hi,
ST Restricted
> -----Original Message-----
> 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
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
2021-10-05 12:50 ` patrick.delaunay
@ 2021-10-05 13:32 ` Marek Vasut
2021-10-05 13:41 ` patrick.delaunay
0 siblings, 1 reply; 6+ messages in thread
From: Marek Vasut @ 2021-10-05 13:32 UTC (permalink / raw)
To: patrick.delaunay, u-boot; +Cc: 'Lukasz Majewski'
On 10/5/21 2:50 PM, patrick.delaunay@foss.st.com wrote:
> 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"
Does it work for multiple SPI NORs at the same time ?
^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
2021-10-05 13:32 ` Marek Vasut
@ 2021-10-05 13:41 ` patrick.delaunay
2021-10-05 15:07 ` Patrick DELAUNAY
0 siblings, 1 reply; 6+ messages in thread
From: patrick.delaunay @ 2021-10-05 13:41 UTC (permalink / raw)
To: 'Marek Vasut', u-boot; +Cc: 'Lukasz Majewski'
Hi,
ST Restricted
> -----Original Message-----
> From: Marek Vasut <marex@denx.de>
> Sent: mardi 5 octobre 2021 15:33
> To: patrick.delaunay@foss.st.com; u-boot@lists.denx.de
> Cc: 'Lukasz Majewski' <lukma@denx.de>
> Subject: Re: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
>
> On 10/5/21 2:50 PM, patrick.delaunay@foss.st.com wrote:
> > 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"
>
> 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
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
2021-10-05 13:41 ` patrick.delaunay
@ 2021-10-05 15:07 ` Patrick DELAUNAY
0 siblings, 0 replies; 6+ messages in thread
From: Patrick DELAUNAY @ 2021-10-05 15:07 UTC (permalink / raw)
To: 'Marek Vasut', u-boot
Cc: 'Lukasz Majewski', Christophe KERELLO, Patrice CHOTARD
Hi,
On 10/5/21 3:41 PM, patrick.delaunay@foss.st.com wrote:
> Hi,
>
>
> ST Restricted
>
>> -----Original Message-----
>> From: Marek Vasut <marex@denx.de>
>> Sent: mardi 5 octobre 2021 15:33
>> To: patrick.delaunay@foss.st.com; u-boot@lists.denx.de
>> Cc: 'Lukasz Majewski' <lukma@denx.de>
>> Subject: Re: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
>>
>> On 10/5/21 2:50 PM, patrick.delaunay@foss.st.com wrote:
>>> 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"
>> 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 <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
Test with dfu MTD backend + export of all device present on STM32MP157C-EV1
dfu_alt_info=ram 0=uImage ram 0xc2000000 0x2000000;devicetree.dtb ram
0xc4000000 0x100000;uramdisk.image.gz ram 0xc4400000 0x10000000&mmc
0=mmc0_fsbl1 part 0 1;mmc0_fsbl2 part 0 2;mmc0_fip part 0 3;mmc0_boot
part 0 4;mmc0_vendorfs part 0 5;mmc0_rootfs part 0 6;mmc0_userfs part 0
7&mmc 1=mmc1_boot1 raw 0x0 0x200000 mmcpart 1;mmc1_boot2 raw 0x0
0x200000 mmcpart 2;mmc1_fip part 1 1;mmc1_bootfs part 1 2;mmc1_vendorfs
part 1 3;mmc1_rootfs part 1 4;mmc1_userfs part 1 5&mtd nor0=nor0 raw 0x0
0x4000000 &mtd nor1=nor1 raw 0x0 0x4000000 &mtd nand0=nand0 raw 0x0
0x40000000
$> dfu-util -l
dfu-util 0.9
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=19, name="nand0", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=18, name="nor1", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=17, name="nor0", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=16, name="mmc1_userfs",
serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=15, name="mmc1_rootfs",
serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=14, name="mmc1_vendorfs",
serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=13, name="mmc1_bootfs",
serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=12, name="mmc1_fip", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=11, name="mmc1_boot2", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=10, name="mmc1_boot1", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=9, name="mmc0_userfs", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=8, name="mmc0_rootfs", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=7, name="mmc0_vendorfs",
serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=6, name="mmc0_boot", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=5, name="mmc0_fip", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=4, name="mmc0_fsbl2", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=3, name="mmc0_fsbl1", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=2, name="uramdisk.image.gz",
serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=1, name="devicetree.dtb",
serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=9, cfg=1, intf=0,
path="1-5.4.2", alt=0, name="uImage", serial="004700223338511534383330"
and I can dump the nor content of the 2 instance:
$> dfu-util -a 17 -U nor0.bin
$> dfu-util -a 18 -U nor1.bin
the more simple configuration is
STMP32MP1> env set dfu_alt_info "mtd nor0=nor0 raw 0x0 0x4000000 &mtd
nor1=nor1 raw 0x0 0x4000000"
For me normally it is working as SPI reconfiguration is now managed in
MTD side
it wasn't the case in previosu U-boot version.
-----------------------------------------------------------------------------------------------------------------------------
It can be done also with sf backend => but I don't sure it is safe ...
sf probe issue ?
The command that I use is:
STM32MP> env set dfu_alt_info "sf 0:0=nor0 raw 0x0 0x4000000&sf 0:1=nor1
raw 0x0 0x4000000"
STM32MP> dfu 0
$> dfu-util -l
dfu-util 0.9
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
Found DFU: [0483:df11] ver=0200, devnum=11, cfg=1, intf=0,
path="1-5.4.2", alt=1, name="nor1", serial="004700223338511534383330"
Found DFU: [0483:df11] ver=0200, devnum=11, cfg=1, intf=0,
path="1-5.4.2", alt=0, name="nor0", serial="004700223338511534383330"
Regards
Patrick
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-10-05 15:07 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-05 12:40 [PATCH v2] dfu: dfu_sf: Add support for multiple flashes Marek Vasut
2021-10-05 12:50 ` patrick.delaunay
2021-10-05 13:32 ` Marek Vasut
2021-10-05 13:41 ` patrick.delaunay
2021-10-05 15:07 ` Patrick DELAUNAY
2021-10-05 13:01 ` patrick.delaunay
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).