Re: [PATCH u-boot-dm + u-boot-spi v2 3/7] mtd: add support for parsing partitions defined in OF

2021-02-10 Thread Pali Rohár
On Tuesday 09 February 2021 15:44:48 Marek Behún wrote:
> Add support for parsing partitions defined in device-trees via the
> `partitions` node with `fixed-partitions` compatible.
> 
> The `mtdparts`/`mtdids` mechanism takes precedence. If some partitions
> are defined for a MTD device via this mechanism, the code won't register
> partitions for that MTD device from OF, even if they are defined.
> 
> Signed-off-by: Marek Behún 
> Cc: Simon Glass 
> Cc: Heiko Schocher 
> Cc: Jagan Teki 
> ---
>  drivers/mtd/mtd_uboot.c | 106 +++-
>  drivers/mtd/mtdpart.c   |  60 +++
>  include/linux/mtd/mtd.h |   9 
>  3 files changed, 131 insertions(+), 44 deletions(-)
> 
> diff --git a/drivers/mtd/mtd_uboot.c b/drivers/mtd/mtd_uboot.c
> index 9360d4ed17..7fb72eb1f4 100644
> --- a/drivers/mtd/mtd_uboot.c
> +++ b/drivers/mtd/mtd_uboot.c
> @@ -197,53 +197,11 @@ static void mtd_del_all_parts(void)
>   } while (ret > 0);
>  }
>  
> -int mtd_probe_devices(void)
> +static int parse_mtdparts(const char *mtdparts, const char *mtdids)
>  {
> - static char *old_mtdparts;
> - static char *old_mtdids;
> - const char *mtdparts = get_mtdparts();
> - const char *mtdids = get_mtdids();
> - const char *mtdparts_next = mtdparts;
> + const char *mtdparts_next;
>   struct mtd_info *mtd;
>  
> - mtd_probe_uclass_mtd_devs();
> -
> - /*
> -  * Check if mtdparts/mtdids changed, if the MTD dev list was updated
> -  * or if our previous attempt to delete existing partititions failed.
> -  * In any of these cases we want to update the partitions, otherwise,
> -  * everything is up-to-date and we can return 0 directly.
> -  */
> - if ((!mtdparts && !old_mtdparts && !mtdids && !old_mtdids) ||
> - (mtdparts && old_mtdparts && mtdids && old_mtdids &&
> -  !mtd_dev_list_updated() && !mtd_del_all_parts_failed &&
> -  !strcmp(mtdparts, old_mtdparts) &&
> -  !strcmp(mtdids, old_mtdids)))
> - return 0;
> -
> - /* Update the local copy of mtdparts */
> - free(old_mtdparts);
> - free(old_mtdids);
> - old_mtdparts = strdup(mtdparts);
> - old_mtdids = strdup(mtdids);
> -
> - /*
> -  * Remove all old parts. Note that partition removal can fail in case
> -  * one of the partition is still being used by an MTD user, so this
> -  * does not guarantee that all old partitions are gone.
> -  */
> - mtd_del_all_parts();
> -
> - /*
> -  * Call mtd_dev_list_updated() to clear updates generated by our own
> -  * parts removal loop.
> -  */
> - mtd_dev_list_updated();
> -
> - /* If either mtdparts or mtdids is empty, then exit */
> - if (!mtdparts || !mtdids)
> - return 0;
> -
>   /* Start the parsing by ignoring the extra 'mtdparts=' prefix, if any */
>   if (!strncmp(mtdparts, "mtdparts=", sizeof("mtdparts=") - 1))
>   mtdparts += 9;
> @@ -342,6 +300,66 @@ int mtd_probe_devices(void)
>   put_mtd_device(mtd);
>   }
>  
> + return 0;
> +}
> +
> +int mtd_probe_devices(void)
> +{
> + static char *old_mtdparts;
> + static char *old_mtdids;
> + const char *mtdparts = get_mtdparts();
> + const char *mtdids = get_mtdids();
> + struct mtd_info *mtd;
> +
> + mtd_probe_uclass_mtd_devs();
> +
> + /*
> +  * Check if mtdparts/mtdids changed, if the MTD dev list was updated
> +  * or if our previous attempt to delete existing partititions failed.
> +  * In any of these cases we want to update the partitions, otherwise,
> +  * everything is up-to-date and we can return 0 directly.
> +  */
> + if ((!mtdparts && !old_mtdparts && !mtdids && !old_mtdids) ||
> + (mtdparts && old_mtdparts && mtdids && old_mtdids &&
> +  !mtd_dev_list_updated() && !mtd_del_all_parts_failed &&
> +  !strcmp(mtdparts, old_mtdparts) &&
> +  !strcmp(mtdids, old_mtdids)))
> + return 0;
> +
> + /* Update the local copy of mtdparts */
> + free(old_mtdparts);
> + free(old_mtdids);
> + old_mtdparts = strdup(mtdparts);
> + old_mtdids = strdup(mtdids);
> +
> + /*
> +  * Remove all old parts. Note that partition removal can fail in case
> +  * one of the partition is still being used by an MTD user, so this
> +  * does not guarantee that all old partitions are gone.
> +  */
> + mtd_del_all_parts();
> +
> + /*
> +  * Call mtd_dev_list_updated() to clear updates generated by our own
> +  * parts removal loop.
> +  */
> + mtd_dev_list_updated();
> +
> + /* If both mtdparts and mtdids are non-empty, parse */
> + if (mtdparts && mtdids) {
> + if (parse_mtdparts(mtdparts, mtdids) < 0)
> + printf("Failed parsing MTD partitions from 
> mtdparts!\n");
> + }
> +
> + /* Fallback to OF partitions */
> + mtd_for_each_device(mtd) {
> +   

[PATCH u-boot-dm + u-boot-spi v2 3/7] mtd: add support for parsing partitions defined in OF

2021-02-09 Thread Marek Behún
Add support for parsing partitions defined in device-trees via the
`partitions` node with `fixed-partitions` compatible.

The `mtdparts`/`mtdids` mechanism takes precedence. If some partitions
are defined for a MTD device via this mechanism, the code won't register
partitions for that MTD device from OF, even if they are defined.

Signed-off-by: Marek Behún 
Cc: Simon Glass 
Cc: Heiko Schocher 
Cc: Jagan Teki 
---
 drivers/mtd/mtd_uboot.c | 106 +++-
 drivers/mtd/mtdpart.c   |  60 +++
 include/linux/mtd/mtd.h |   9 
 3 files changed, 131 insertions(+), 44 deletions(-)

diff --git a/drivers/mtd/mtd_uboot.c b/drivers/mtd/mtd_uboot.c
index 9360d4ed17..7fb72eb1f4 100644
--- a/drivers/mtd/mtd_uboot.c
+++ b/drivers/mtd/mtd_uboot.c
@@ -197,53 +197,11 @@ static void mtd_del_all_parts(void)
} while (ret > 0);
 }
 
-int mtd_probe_devices(void)
+static int parse_mtdparts(const char *mtdparts, const char *mtdids)
 {
-   static char *old_mtdparts;
-   static char *old_mtdids;
-   const char *mtdparts = get_mtdparts();
-   const char *mtdids = get_mtdids();
-   const char *mtdparts_next = mtdparts;
+   const char *mtdparts_next;
struct mtd_info *mtd;
 
-   mtd_probe_uclass_mtd_devs();
-
-   /*
-* Check if mtdparts/mtdids changed, if the MTD dev list was updated
-* or if our previous attempt to delete existing partititions failed.
-* In any of these cases we want to update the partitions, otherwise,
-* everything is up-to-date and we can return 0 directly.
-*/
-   if ((!mtdparts && !old_mtdparts && !mtdids && !old_mtdids) ||
-   (mtdparts && old_mtdparts && mtdids && old_mtdids &&
-!mtd_dev_list_updated() && !mtd_del_all_parts_failed &&
-!strcmp(mtdparts, old_mtdparts) &&
-!strcmp(mtdids, old_mtdids)))
-   return 0;
-
-   /* Update the local copy of mtdparts */
-   free(old_mtdparts);
-   free(old_mtdids);
-   old_mtdparts = strdup(mtdparts);
-   old_mtdids = strdup(mtdids);
-
-   /*
-* Remove all old parts. Note that partition removal can fail in case
-* one of the partition is still being used by an MTD user, so this
-* does not guarantee that all old partitions are gone.
-*/
-   mtd_del_all_parts();
-
-   /*
-* Call mtd_dev_list_updated() to clear updates generated by our own
-* parts removal loop.
-*/
-   mtd_dev_list_updated();
-
-   /* If either mtdparts or mtdids is empty, then exit */
-   if (!mtdparts || !mtdids)
-   return 0;
-
/* Start the parsing by ignoring the extra 'mtdparts=' prefix, if any */
if (!strncmp(mtdparts, "mtdparts=", sizeof("mtdparts=") - 1))
mtdparts += 9;
@@ -342,6 +300,66 @@ int mtd_probe_devices(void)
put_mtd_device(mtd);
}
 
+   return 0;
+}
+
+int mtd_probe_devices(void)
+{
+   static char *old_mtdparts;
+   static char *old_mtdids;
+   const char *mtdparts = get_mtdparts();
+   const char *mtdids = get_mtdids();
+   struct mtd_info *mtd;
+
+   mtd_probe_uclass_mtd_devs();
+
+   /*
+* Check if mtdparts/mtdids changed, if the MTD dev list was updated
+* or if our previous attempt to delete existing partititions failed.
+* In any of these cases we want to update the partitions, otherwise,
+* everything is up-to-date and we can return 0 directly.
+*/
+   if ((!mtdparts && !old_mtdparts && !mtdids && !old_mtdids) ||
+   (mtdparts && old_mtdparts && mtdids && old_mtdids &&
+!mtd_dev_list_updated() && !mtd_del_all_parts_failed &&
+!strcmp(mtdparts, old_mtdparts) &&
+!strcmp(mtdids, old_mtdids)))
+   return 0;
+
+   /* Update the local copy of mtdparts */
+   free(old_mtdparts);
+   free(old_mtdids);
+   old_mtdparts = strdup(mtdparts);
+   old_mtdids = strdup(mtdids);
+
+   /*
+* Remove all old parts. Note that partition removal can fail in case
+* one of the partition is still being used by an MTD user, so this
+* does not guarantee that all old partitions are gone.
+*/
+   mtd_del_all_parts();
+
+   /*
+* Call mtd_dev_list_updated() to clear updates generated by our own
+* parts removal loop.
+*/
+   mtd_dev_list_updated();
+
+   /* If both mtdparts and mtdids are non-empty, parse */
+   if (mtdparts && mtdids) {
+   if (parse_mtdparts(mtdparts, mtdids) < 0)
+   printf("Failed parsing MTD partitions from 
mtdparts!\n");
+   }
+
+   /* Fallback to OF partitions */
+   mtd_for_each_device(mtd) {
+   if (list_empty(>partitions)) {
+   if (add_mtd_partitions_of(mtd) < 0)
+   printf("Failed parsing