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


ST Restricted

-----Original Message-----
From: U-Boot <u-boot-boun...@lists.denx.de> On Behalf Of Marek Vasut
Sent: mardi 5 octobre 2021 14:40
To: u-boot@lists.denx.de
Cc: Marek Vasut <ma...@denx.de>; Lukasz Majewski <lu...@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 <ma...@denx.de>
Cc: Lukasz Majewski <lu...@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 ?

Reply via email to