X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=cmd%2Fpart.c;h=5e4e45ca6d8bebe58a438223cce4c7c80177e58e;hb=fd3a7ae8e6fa58a566dae182098effc61c2d9efd;hp=55995097eb00c8d1a12f03a621d2d29082b58b37;hpb=2e192b245ed36a63bab0ef576999a95e23f60ecd;p=oweals%2Fu-boot.git diff --git a/cmd/part.c b/cmd/part.c index 55995097eb..5e4e45ca6d 100644 --- a/cmd/part.c +++ b/cmd/part.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. * @@ -12,24 +13,25 @@ * (C) Copyright 2003 - 2004 * Sysgo Real-Time Solutions, AG * Pavel Bartusek - * - * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include +#include #include #include -#ifndef CONFIG_PARTITION_UUIDS -#error CONFIG_PARTITION_UUIDS must be enabled for CONFIG_CMD_PART to be enabled -#endif +enum cmd_part_info { + CMD_PART_INFO_START = 0, + CMD_PART_INFO_SIZE, + CMD_PART_INFO_NUMBER +}; static int do_part_uuid(int argc, char * const argv[]) { int part; - block_dev_desc_t *dev_desc; + struct blk_desc *dev_desc; disk_partition_t info; if (argc < 2) @@ -37,12 +39,12 @@ static int do_part_uuid(int argc, char * const argv[]) if (argc > 3) return CMD_RET_USAGE; - part = get_device_and_partition(argv[0], argv[1], &dev_desc, &info, 0); + part = blk_get_device_part_str(argv[0], argv[1], &dev_desc, &info, 0); if (part < 0) return 1; if (argc > 2) - setenv(argv[2], info.uuid); + env_set(argv[2], info.uuid); else printf("%s\n", info.uuid); @@ -52,7 +54,7 @@ static int do_part_uuid(int argc, char * const argv[]) static int do_part_list(int argc, char * const argv[]) { int ret; - block_dev_desc_t *desc; + struct blk_desc *desc; char *var = NULL; bool bootable = false; int i; @@ -81,7 +83,7 @@ static int do_part_list(int argc, char * const argv[]) return CMD_RET_USAGE; } - ret = get_device(argv[0], argv[1], &desc); + ret = blk_get_device_by_str(argv[0], argv[1], &desc); if (ret < 0) return 1; @@ -90,9 +92,9 @@ static int do_part_list(int argc, char * const argv[]) char str[512] = { '\0', }; disk_partition_t info; - for (p = 1; p < 128; p++) { + for (p = 1; p < MAX_SEARCH_PARTITIONS; p++) { char t[5]; - int r = get_partition_info(desc, p, &info); + int r = part_get_info(desc, p, &info); if (r != 0) continue; @@ -103,20 +105,21 @@ static int do_part_list(int argc, char * const argv[]) sprintf(t, "%s%x", str[0] ? " " : "", p); strcat(str, t); } - setenv(var, str); + env_set(var, str); return 0; } - print_part(desc); + part_print(desc); return 0; } -static int do_part_start(int argc, char * const argv[]) +static int do_part_info(int argc, char * const argv[], enum cmd_part_info param) { - block_dev_desc_t *desc; + struct blk_desc *desc; disk_partition_t info; char buf[512] = { 0 }; + char *endp; int part; int err; int ret; @@ -126,58 +129,57 @@ static int do_part_start(int argc, char * const argv[]) if (argc > 4) return CMD_RET_USAGE; - part = simple_strtoul(argv[2], NULL, 0); - - ret = get_device(argv[0], argv[1], &desc); + ret = blk_get_device_by_str(argv[0], argv[1], &desc); if (ret < 0) return 1; - err = get_partition_info(desc, part, &info); - if (err) - return 1; + part = simple_strtoul(argv[2], &endp, 0); + if (*endp == '\0') { + err = part_get_info(desc, part, &info); + if (err) + return 1; + } else { + part = part_get_info_by_name(desc, argv[2], &info); + if (part == -1) + return 1; + } - snprintf(buf, sizeof(buf), LBAF, info.start); + switch (param) { + case CMD_PART_INFO_START: + snprintf(buf, sizeof(buf), LBAF, info.start); + break; + case CMD_PART_INFO_SIZE: + snprintf(buf, sizeof(buf), LBAF, info.size); + break; + case CMD_PART_INFO_NUMBER: + snprintf(buf, sizeof(buf), "0x%x", part); + break; + default: + printf("** Unknown cmd_part_info value: %d\n", param); + return 1; + } if (argc > 3) - setenv(argv[3], buf); + env_set(argv[3], buf); else printf("%s\n", buf); return 0; } -static int do_part_size(int argc, char * const argv[]) +static int do_part_start(int argc, char * const argv[]) { - block_dev_desc_t *desc; - disk_partition_t info; - char buf[512] = { 0 }; - int part; - int err; - int ret; - - if (argc < 3) - return CMD_RET_USAGE; - if (argc > 4) - return CMD_RET_USAGE; - - part = simple_strtoul(argv[2], NULL, 0); - - ret = get_device(argv[0], argv[1], &desc); - if (ret < 0) - return 1; - - err = get_partition_info(desc, part, &info); - if (err) - return 1; - - snprintf(buf, sizeof(buf), LBAF, info.size); + return do_part_info(argc, argv, CMD_PART_INFO_START); +} - if (argc > 3) - setenv(argv[3], buf); - else - printf("%s\n", buf); +static int do_part_size(int argc, char * const argv[]) +{ + return do_part_info(argc, argv, CMD_PART_INFO_SIZE); +} - return 0; +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[]) @@ -193,6 +195,8 @@ static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return do_part_start(argc - 2, argv + 2); else if (!strcmp(argv[1], "size")) return do_part_size(argc - 2, argv + 2); + else if (!strcmp(argv[1], "number")) + return do_part_number(argc - 2, argv + 2); return CMD_RET_USAGE; } @@ -211,6 +215,11 @@ U_BOOT_CMD( " flags can be -bootable (list only bootable partitions)\n" "part start \n" " - set environment variable to the start of the partition (in blocks)\n" + " part can be either partition number or partition name\n" "part size \n" - " - set environment variable to the size of the partition (in blocks)" + " - set environment variable to the size of the partition (in blocks)\n" + " 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" );