X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=cmd%2Fpart.c;h=0ce190005d327d9879eee6b7ebd5f6797668427c;hb=HEAD;hp=6cfb67b2795932c417c586591d56c8fb0e83be10;hpb=9c6115822e894ead72fa4c094bf718eaabb9e103;p=platform%2Fkernel%2Fu-boot.git diff --git a/cmd/part.c b/cmd/part.c index 6cfb67b..0ce1900 100644 --- a/cmd/part.c +++ b/cmd/part.c @@ -28,11 +28,11 @@ enum cmd_part_info { CMD_PART_INFO_NUMBER }; -static int do_part_uuid(int argc, char * const argv[]) +static int do_part_uuid(int argc, char *const argv[]) { int part; struct blk_desc *dev_desc; - disk_partition_t info; + struct disk_partition info; if (argc < 2) return CMD_RET_USAGE; @@ -51,7 +51,7 @@ static int do_part_uuid(int argc, char * const argv[]) return 0; } -static int do_part_list(int argc, char * const argv[]) +static int do_part_list(int argc, char *const argv[]) { int ret; struct blk_desc *desc; @@ -89,10 +89,10 @@ static int do_part_list(int argc, char * const argv[]) if (var != NULL) { int p; - char str[512] = { '\0', }; - disk_partition_t info; + char str[3 * MAX_SEARCH_PARTITIONS] = { '\0', }; + struct disk_partition info; - for (p = 1; p < MAX_SEARCH_PARTITIONS; p++) { + for (p = 1; p <= MAX_SEARCH_PARTITIONS; p++) { char t[5]; int r = part_get_info(desc, p, &info); @@ -114,10 +114,10 @@ static int do_part_list(int argc, char * const argv[]) return 0; } -static int do_part_info(int argc, char * const argv[], enum cmd_part_info param) +static int do_part_info(int argc, char *const argv[], enum cmd_part_info param) { struct blk_desc *desc; - disk_partition_t info; + struct disk_partition info; char buf[512] = { 0 }; char *endp; int part; @@ -140,7 +140,7 @@ static int do_part_info(int argc, char * const argv[], enum cmd_part_info param) return 1; } else { part = part_get_info_by_name(desc, argv[2], &info); - if (part == -1) + if (part < 0) return 1; } @@ -152,7 +152,7 @@ static int do_part_info(int argc, char * const argv[], enum cmd_part_info param) snprintf(buf, sizeof(buf), LBAF, info.size); break; case CMD_PART_INFO_NUMBER: - snprintf(buf, sizeof(buf), "%d", part); + snprintf(buf, sizeof(buf), "0x%x", part); break; default: printf("** Unknown cmd_part_info value: %d\n", param); @@ -167,22 +167,98 @@ static int do_part_info(int argc, char * const argv[], enum cmd_part_info param) return 0; } -static int do_part_start(int argc, char * const argv[]) +static int do_part_start(int argc, char *const argv[]) { return do_part_info(argc, argv, CMD_PART_INFO_START); } -static int do_part_size(int argc, char * const argv[]) +static int do_part_size(int argc, char *const argv[]) { return do_part_info(argc, argv, CMD_PART_INFO_SIZE); } -static int do_part_number(int argc, char * const argv[]) +static int do_part_number(int argc, char *const argv[]) { return do_part_info(argc, argv, CMD_PART_INFO_NUMBER); } -static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +static int do_part_set(int argc, char *const argv[]) +{ + const char *devname, *partstr, *typestr; + struct blk_desc *desc; + int dev; + + if (argc < 3) + return CMD_RET_USAGE; + + /* Look up the device */ + devname = argv[0]; + partstr = argv[1]; + typestr = argv[2]; + dev = blk_get_device_by_str(devname, partstr, &desc); + if (dev < 0) { + printf("** Bad device specification %s %s **\n", devname, + partstr); + return CMD_RET_FAILURE; + } + + desc->part_type = part_get_type_by_name(typestr); + if (!desc->part_type) { + printf("Unknown partition type '%s'\n", typestr); + return CMD_RET_FAILURE; + } + part_print(desc); + + return 0; +} + +#ifdef CONFIG_PARTITION_TYPE_GUID +static int do_part_type(int argc, char *const argv[]) +{ + int part; + struct blk_desc *dev_desc; + struct disk_partition info; + + if (argc < 2) + return CMD_RET_USAGE; + if (argc > 3) + return CMD_RET_USAGE; + + part = blk_get_device_part_str(argv[0], argv[1], &dev_desc, &info, 0); + if (part < 0) + return 1; + + if (argc > 2) + env_set(argv[2], info.type_guid); + else + printf("%s\n", info.type_guid); + + return 0; +} +#endif + +static int do_part_types(int argc, char * const argv[]) +{ + struct part_driver *drv = ll_entry_start(struct part_driver, + part_driver); + const int n_ents = ll_entry_count(struct part_driver, part_driver); + struct part_driver *entry; + int i = 0; + + puts("Supported partition tables"); + + for (entry = drv; entry != drv + n_ents; entry++) { + printf("%c %s", i ? ',' : ':', entry->name); + i++; + } + if (!i) + puts(": "); + puts("\n"); + return CMD_RET_SUCCESS; +} + +static int do_part(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { if (argc < 2) return CMD_RET_USAGE; @@ -197,7 +273,14 @@ static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return do_part_size(argc - 2, argv + 2); else if (!strcmp(argv[1], "number")) return do_part_number(argc - 2, argv + 2); - + else if (!strcmp(argv[1], "types")) + return do_part_types(argc - 2, argv + 2); + else if (!strcmp(argv[1], "set")) + return do_part_set(argc - 2, argv + 2); +#ifdef CONFIG_PARTITION_TYPE_GUID + else if (!strcmp(argv[1], "type")) + return do_part_type(argc - 2, argv + 2); +#endif return CMD_RET_USAGE; } @@ -221,5 +304,15 @@ U_BOOT_CMD( " part can be either partition number or partition name\n" "part number \n" " - set environment variable to the partition number using the partition name\n" - " part must be specified as partition name" + " part must be specified as partition name\n" +#ifdef CONFIG_PARTITION_TYPE_GUID + "part type :\n" + " - print partition type\n" +#endif + "part type : \n" + " - set environment variable to partition type\n" + "part set type\n" + " - set partition type for a device\n" + "part types\n" + " - list supported partition table types" );