+static int raw_part_get_info_by_name(struct blk_desc *dev_desc,
+ const char *name,
+ struct disk_partition *info)
+{
+ /* strlen("fastboot_raw_partition_") + PART_NAME_LEN + 1 */
+ char env_desc_name[23 + PART_NAME_LEN + 1];
+ char *raw_part_desc;
+ const char *argv[2];
+ const char **parg = argv;
+
+ /* check for raw partition descriptor */
+ strcpy(env_desc_name, "fastboot_raw_partition_");
+ strlcat(env_desc_name, name, sizeof(env_desc_name));
+ raw_part_desc = strdup(env_get(env_desc_name));
+ if (raw_part_desc == NULL)
+ return -ENODEV;
+
+ /*
+ * parse partition descriptor
+ *
+ * <lba_start> <lba_size> [mmcpart <num>]
+ */
+ for (; parg < argv + sizeof(argv) / sizeof(*argv); ++parg) {
+ *parg = strsep(&raw_part_desc, " ");
+ if (*parg == NULL) {
+ pr_err("Invalid number of arguments.\n");
+ return -ENODEV;
+ }
+ }
+
+ info->start = simple_strtoul(argv[0], NULL, 0);
+ info->size = simple_strtoul(argv[1], NULL, 0);
+ info->blksz = dev_desc->blksz;
+ strlcpy((char *)info->name, name, PART_NAME_LEN);
+
+ if (raw_part_desc) {
+ if (strcmp(strsep(&raw_part_desc, " "), "mmcpart") == 0) {
+ ulong mmcpart = simple_strtoul(raw_part_desc, NULL, 0);
+ int ret = blk_dselect_hwpart(dev_desc, mmcpart);
+
+ if (ret)
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+static int do_get_part_info(struct blk_desc **dev_desc, const char *name,
+ struct disk_partition *info)