
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