Message ID | 1480503692-17255-5-git-send-email-patrick.delaunay73@gmail.com |
---|---|
State | RFC |
Delegated to: | Scott Wood |
Headers | show |
Hi Patrick, On 30 November 2016 at 04:01, Patrick Delaunay <patrick.delaunay73@gmail.com> wrote: > From: Patrick Delaunay <patrick.delaunay@st.com> > > support gpt write for MTD device >> gpt write nand 0 >> gpt write nor 0 > > Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com> > Signed-off-by: Patrick Delaunay <patrick.delaunay73@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
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 + #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) + 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; + } U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt,