[U-Boot] [RFC PATCH v2 4/8] cmd: gpt: update command to support GPT over MTD

Simon Glass sjg at chromium.org
Thu Dec 1 03:21:16 CET 2016


Hi Patrick,

On 30 November 2016 at 04:01, Patrick Delaunay
<patrick.delaunay73 at gmail.com> wrote:
> From: Patrick Delaunay <patrick.delaunay at st.com>
>
> support gpt write for MTD device
>> gpt write nand 0
>> gpt write nor 0
>
> Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>
> Signed-off-by: Patrick Delaunay <patrick.delaunay73 at gmail.com>
> ---
>
> Changes in v2: None
>
>  cmd/gpt.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
>  1 file changed, 82 insertions(+), 16 deletions(-)

Can you please out your refactoring changes into a separate patch?
Then have a patch that adds your feature.

>
> diff --git a/cmd/gpt.c b/cmd/gpt.c
> index 897596a..9e398e9 100644
> --- a/cmd/gpt.c
> +++ b/cmd/gpt.c
> @@ -20,6 +20,10 @@
>  #include <div64.h>
>  #include <memalign.h>
>
> +#ifdef CONFIG_EFI_PARTITION_MTD
> +#include <linux/mtd/mtd.h>
> +#endif

I don't think you need the #ifdef, unless including that file is harmful.

> +
>  #ifndef CONFIG_PARTITION_UUIDS
>  #error CONFIG_PARTITION_UUIDS must be enabled for CONFIG_CMD_GPT to be enabled
>  #endif
> @@ -168,7 +172,8 @@ static bool found_key(const char *str, const char *key)
>   * @return - zero on success, otherwise error
>   *
>   */
> -static int set_gpt_info(struct blk_desc *dev_desc,
> +static int set_gpt_info(unsigned int lba,
> +                       unsigned int blksz,
>                         const char *str_part,
>                         char **str_disk_guid,
>                         disk_partition_t **partitions,
> @@ -183,8 +188,7 @@ static int set_gpt_info(struct blk_desc *dev_desc,
>         uint64_t size_ll, start_ll;
>         lbaint_t offset = 0;
>
> -       debug("%s:  lba num: 0x%x %d\n", __func__,
> -             (unsigned int)dev_desc->lba, (unsigned int)dev_desc->lba);
> +       debug("%s:  lba num: 0x%x %d\n", __func__, lba, lba);
>
>         if (str_part == NULL)
>                 return -1;
> @@ -302,7 +306,7 @@ static int set_gpt_info(struct blk_desc *dev_desc,
>                         parts[i].size = 0;
>                 } else {
>                         size_ll = ustrtoull(p, &p, 0);
> -                       parts[i].size = lldiv(size_ll, dev_desc->blksz);
> +                       parts[i].size = lldiv(size_ll, blksz);
>                 }
>
>                 free(val);
> @@ -313,7 +317,7 @@ static int set_gpt_info(struct blk_desc *dev_desc,
>                         if (extract_env(val, &p))
>                                 p = val;
>                         start_ll = ustrtoull(p, &p, 0);
> -                       parts[i].start = lldiv(start_ll, dev_desc->blksz);
> +                       parts[i].start = lldiv(start_ll, blksz);
>                         free(val);
>                 }
>
> @@ -337,6 +341,16 @@ err:
>         return errno;
>  }
>
> +static void print_gpt_info_err(int ret)
> +{
> +       if (ret == -1)

These should really use an enum rather than be open-coded. Or use
errno.h values.

> +               printf("No partition list provided\n");
> +       if (ret == -2)
> +               printf("Missing disk guid\n");
> +       if ((ret == -3) || (ret == -4))
> +               printf("Partition list incomplete\n");
> +}
> +
>  static int gpt_default(struct blk_desc *blk_dev_desc, const char *str_part)
>  {
>         int ret;
> @@ -344,16 +358,13 @@ static int gpt_default(struct blk_desc *blk_dev_desc, const char *str_part)
>         u8 part_count = 0;
>         disk_partition_t *partitions = NULL;
>
> +       if (!str_part)
> +               return -1;
>         /* fill partitions */
> -       ret = set_gpt_info(blk_dev_desc, str_part,
> +       ret = set_gpt_info(blk_dev_desc->lba, blk_dev_desc->blksz, str_part,
>                         &str_disk_guid, &partitions, &part_count);
>         if (ret) {
> -               if (ret == -1)
> -                       printf("No partition list provided\n");
> -               if (ret == -2)
> -                       printf("Missing disk guid\n");
> -               if ((ret == -3) || (ret == -4))
> -                       printf("Partition list incomplete\n");
> +               print_gpt_info_err(ret);
>                 return -1;
>         }
>
> @@ -376,7 +387,7 @@ static int gpt_verify(struct blk_desc *blk_dev_desc, const char *str_part)
>         int ret = 0;
>
>         /* fill partitions */
> -       ret = set_gpt_info(blk_dev_desc, str_part,
> +       ret = set_gpt_info(blk_dev_desc->lba, blk_dev_desc->blksz, str_part,
>                         &str_disk_guid, &partitions, &part_count);
>         if (ret) {
>                 if (ret == -1) {
> @@ -402,6 +413,35 @@ static int gpt_verify(struct blk_desc *blk_dev_desc, const char *str_part)
>         return ret;
>  }
>
> +#ifdef CONFIG_EFI_PARTITION_MTD
> +static int gpt_default_mtd(struct mtd_info *mtd_info, const char *str_part)
> +{
> +       int ret;
> +       char *str_disk_guid;
> +       u8 part_count = 0;
> +       disk_partition_t *partitions = NULL;
> +       unsigned int lba = lldiv(mtd_info->size, MTD_LBA_SIZE);
> +
> +       if (!str_part)
> +               return -1;
> +
> +       /* fill partitions */
> +       ret = set_gpt_info(lba, MTD_LBA_SIZE, str_part,
> +                          &str_disk_guid, &partitions, &part_count);
> +       if (ret) {
> +               print_gpt_info_err(ret);
> +               return -1;
> +       }
> +
> +       /* save partitions layout to disk */
> +       ret = gpt_restore_mtd(mtd_info, str_disk_guid, partitions, part_count);
> +       free(str_disk_guid);
> +       free(partitions);
> +
> +       return ret;
> +}
> +#endif
> +
>  /**
>   * do_gpt(): Perform GPT operations
>   *
> @@ -418,6 +458,10 @@ static int do_gpt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>         int dev = 0;
>         char *ep;
>         struct blk_desc *blk_dev_desc = NULL;
> +#ifdef CONFIG_EFI_PARTITION_MTD
> +       struct mtd_info *mtd_info = NULL;
> +       char mtd_dev[16];
> +#endif
>
>         if (argc < 4 || argc > 5)
>                 return CMD_RET_USAGE;
> @@ -428,17 +472,38 @@ static int do_gpt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>                 return CMD_RET_USAGE;
>         }
>         blk_dev_desc = blk_get_dev(argv[2], dev);
> +#ifdef CONFIG_EFI_PARTITION_MTD
>         if (!blk_dev_desc) {
> +                       sprintf(mtd_dev, "%s%d", argv[2], dev);
> +                       mtd_info = get_mtd_device_nm(mtd_dev);
> +                       if (IS_ERR(mtd_info))
> +                               ret = CMD_RET_FAILURE;
> +       }
> +#else
> +       if (!blk_dev_desc)
> +               ret = CMD_RET_FAILURE;
> +#endif
> +       if (ret) {
>                 printf("%s: %s dev %d NOT available\n",
>                        __func__, argv[2], dev);
> -               return CMD_RET_FAILURE;
> +               return ret;
>         }
>
>         if ((strcmp(argv[1], "write") == 0) && (argc == 5)) {
>                 printf("Writing GPT: ");
> -               ret = gpt_default(blk_dev_desc, argv[4]);
> +               if (blk_dev_desc)
> +                       ret = gpt_default(blk_dev_desc, argv[4]);
> +#ifdef CONFIG_EFI_PARTITION_MTD
> +               else if (mtd_info)
> +                       ret = gpt_default_mtd(mtd_info, argv[4]);
> +#endif
> +               else
> +                       ret = CMD_RET_FAILURE;
>         } else if ((strcmp(argv[1], "verify") == 0)) {
> -               ret = gpt_verify(blk_dev_desc, argv[4]);
> +               if (blk_dev_desc)
> +                       ret = gpt_verify(blk_dev_desc, argv[4]);
> +               else
> +                       ret = CMD_RET_FAILURE;
>                 printf("Verify GPT: ");
>         } else {
>                 return CMD_RET_USAGE;
> @@ -451,6 +516,7 @@ static int do_gpt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>
>         printf("success!\n");
>         return CMD_RET_SUCCESS;
> +

Unrelated change, although you could put a blank line *before* the return.

>  }
>
>  U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt,
> --
> 1.9.1
>

Regards,
Simon


More information about the U-Boot mailing list