From: Patrick Delaunay <patrick.delau...@st.com>

support gpt write for MTD device
> gpt write nand 0
> gpt write nor 0

Signed-off-by: Patrick Delaunay <patrick.delau...@st.com>
Signed-off-by: Patrick Delaunay <patrick.delauna...@gmail.com>
---

Changes in v2: None

 cmd/gpt.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 82 insertions(+), 16 deletions(-)

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,
-- 
1.9.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to