1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 22e192b24SSimon Glass /* 32e192b24SSimon Glass * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. 42e192b24SSimon Glass * 52e192b24SSimon Glass * made from cmd_ext2, which was: 62e192b24SSimon Glass * 72e192b24SSimon Glass * (C) Copyright 2004 82e192b24SSimon Glass * esd gmbh <www.esd-electronics.com> 92e192b24SSimon Glass * Reinhard Arlt <reinhard.arlt@esd-electronics.com> 102e192b24SSimon Glass * 112e192b24SSimon Glass * made from cmd_reiserfs by 122e192b24SSimon Glass * 132e192b24SSimon Glass * (C) Copyright 2003 - 2004 142e192b24SSimon Glass * Sysgo Real-Time Solutions, AG <www.elinos.com> 152e192b24SSimon Glass * Pavel Bartusek <pba@sysgo.com> 162e192b24SSimon Glass */ 172e192b24SSimon Glass 182e192b24SSimon Glass #include <common.h> 192e192b24SSimon Glass #include <config.h> 202e192b24SSimon Glass #include <command.h> 212e192b24SSimon Glass #include <part.h> 222e192b24SSimon Glass #include <vsprintf.h> 232e192b24SSimon Glass 2464e6a49aSSam Protsenko enum cmd_part_info { 2564e6a49aSSam Protsenko CMD_PART_INFO_START = 0, 2664e6a49aSSam Protsenko CMD_PART_INFO_SIZE, 2764e6a49aSSam Protsenko }; 2864e6a49aSSam Protsenko 292e192b24SSimon Glass static int do_part_uuid(int argc, char * const argv[]) 302e192b24SSimon Glass { 312e192b24SSimon Glass int part; 324101f687SSimon Glass struct blk_desc *dev_desc; 332e192b24SSimon Glass disk_partition_t info; 342e192b24SSimon Glass 352e192b24SSimon Glass if (argc < 2) 362e192b24SSimon Glass return CMD_RET_USAGE; 372e192b24SSimon Glass if (argc > 3) 382e192b24SSimon Glass return CMD_RET_USAGE; 392e192b24SSimon Glass 40e35929e4SSimon Glass part = blk_get_device_part_str(argv[0], argv[1], &dev_desc, &info, 0); 412e192b24SSimon Glass if (part < 0) 422e192b24SSimon Glass return 1; 432e192b24SSimon Glass 442e192b24SSimon Glass if (argc > 2) 45382bee57SSimon Glass env_set(argv[2], info.uuid); 462e192b24SSimon Glass else 472e192b24SSimon Glass printf("%s\n", info.uuid); 482e192b24SSimon Glass 492e192b24SSimon Glass return 0; 502e192b24SSimon Glass } 512e192b24SSimon Glass 522e192b24SSimon Glass static int do_part_list(int argc, char * const argv[]) 532e192b24SSimon Glass { 542e192b24SSimon Glass int ret; 554101f687SSimon Glass struct blk_desc *desc; 562e192b24SSimon Glass char *var = NULL; 572e192b24SSimon Glass bool bootable = false; 582e192b24SSimon Glass int i; 592e192b24SSimon Glass 602e192b24SSimon Glass if (argc < 2) 612e192b24SSimon Glass return CMD_RET_USAGE; 622e192b24SSimon Glass 632e192b24SSimon Glass if (argc > 2) { 642e192b24SSimon Glass for (i = 2; i < argc ; i++) { 652e192b24SSimon Glass if (argv[i][0] == '-') { 662e192b24SSimon Glass if (!strcmp(argv[i], "-bootable")) { 672e192b24SSimon Glass bootable = true; 682e192b24SSimon Glass } else { 692e192b24SSimon Glass printf("Unknown option %s\n", argv[i]); 702e192b24SSimon Glass return CMD_RET_USAGE; 712e192b24SSimon Glass } 722e192b24SSimon Glass } else { 732e192b24SSimon Glass var = argv[i]; 742e192b24SSimon Glass break; 752e192b24SSimon Glass } 762e192b24SSimon Glass } 772e192b24SSimon Glass 782e192b24SSimon Glass /* Loops should have been exited at the last argument, which 792e192b24SSimon Glass * as it contained the variable */ 802e192b24SSimon Glass if (argc != i + 1) 812e192b24SSimon Glass return CMD_RET_USAGE; 822e192b24SSimon Glass } 832e192b24SSimon Glass 84ebac37cfSSimon Glass ret = blk_get_device_by_str(argv[0], argv[1], &desc); 852e192b24SSimon Glass if (ret < 0) 862e192b24SSimon Glass return 1; 872e192b24SSimon Glass 882e192b24SSimon Glass if (var != NULL) { 892e192b24SSimon Glass int p; 902e192b24SSimon Glass char str[512] = { '\0', }; 912e192b24SSimon Glass disk_partition_t info; 922e192b24SSimon Glass 932e192b24SSimon Glass for (p = 1; p < 128; p++) { 942e192b24SSimon Glass char t[5]; 953e8bd469SSimon Glass int r = part_get_info(desc, p, &info); 962e192b24SSimon Glass 972e192b24SSimon Glass if (r != 0) 982e192b24SSimon Glass continue; 992e192b24SSimon Glass 1002e192b24SSimon Glass if (bootable && !info.bootable) 1012e192b24SSimon Glass continue; 1022e192b24SSimon Glass 1032e192b24SSimon Glass sprintf(t, "%s%x", str[0] ? " " : "", p); 1042e192b24SSimon Glass strcat(str, t); 1052e192b24SSimon Glass } 106382bee57SSimon Glass env_set(var, str); 1072e192b24SSimon Glass return 0; 1082e192b24SSimon Glass } 1092e192b24SSimon Glass 1103e8bd469SSimon Glass part_print(desc); 1112e192b24SSimon Glass 1122e192b24SSimon Glass return 0; 1132e192b24SSimon Glass } 1142e192b24SSimon Glass 11564e6a49aSSam Protsenko static int do_part_info(int argc, char * const argv[], enum cmd_part_info param) 1162e192b24SSimon Glass { 1174101f687SSimon Glass struct blk_desc *desc; 1182e192b24SSimon Glass disk_partition_t info; 1192e192b24SSimon Glass char buf[512] = { 0 }; 12036df616aSSam Protsenko char *endp; 1212e192b24SSimon Glass int part; 1222e192b24SSimon Glass int err; 1232e192b24SSimon Glass int ret; 1242e192b24SSimon Glass 1252e192b24SSimon Glass if (argc < 3) 1262e192b24SSimon Glass return CMD_RET_USAGE; 1272e192b24SSimon Glass if (argc > 4) 1282e192b24SSimon Glass return CMD_RET_USAGE; 1292e192b24SSimon Glass 130ebac37cfSSimon Glass ret = blk_get_device_by_str(argv[0], argv[1], &desc); 1312e192b24SSimon Glass if (ret < 0) 1322e192b24SSimon Glass return 1; 1332e192b24SSimon Glass 13436df616aSSam Protsenko part = simple_strtoul(argv[2], &endp, 0); 13536df616aSSam Protsenko if (*endp == '\0') { 1363e8bd469SSimon Glass err = part_get_info(desc, part, &info); 1372e192b24SSimon Glass if (err) 1382e192b24SSimon Glass return 1; 13936df616aSSam Protsenko } else { 14036df616aSSam Protsenko part = part_get_info_by_name(desc, argv[2], &info); 14136df616aSSam Protsenko if (part == -1) 14236df616aSSam Protsenko return 1; 14336df616aSSam Protsenko } 1442e192b24SSimon Glass 14564e6a49aSSam Protsenko switch (param) { 14664e6a49aSSam Protsenko case CMD_PART_INFO_START: 1472e192b24SSimon Glass snprintf(buf, sizeof(buf), LBAF, info.start); 14864e6a49aSSam Protsenko break; 14964e6a49aSSam Protsenko case CMD_PART_INFO_SIZE: 15064e6a49aSSam Protsenko snprintf(buf, sizeof(buf), LBAF, info.size); 15164e6a49aSSam Protsenko break; 15264e6a49aSSam Protsenko default: 15364e6a49aSSam Protsenko printf("** Unknown cmd_part_info value: %d\n", param); 15464e6a49aSSam Protsenko return 1; 15564e6a49aSSam Protsenko } 1562e192b24SSimon Glass 1572e192b24SSimon Glass if (argc > 3) 158382bee57SSimon Glass env_set(argv[3], buf); 1592e192b24SSimon Glass else 1602e192b24SSimon Glass printf("%s\n", buf); 1612e192b24SSimon Glass 1622e192b24SSimon Glass return 0; 1632e192b24SSimon Glass } 1642e192b24SSimon Glass 16564e6a49aSSam Protsenko static int do_part_start(int argc, char * const argv[]) 16664e6a49aSSam Protsenko { 16764e6a49aSSam Protsenko return do_part_info(argc, argv, CMD_PART_INFO_START); 16864e6a49aSSam Protsenko } 16964e6a49aSSam Protsenko 1702e192b24SSimon Glass static int do_part_size(int argc, char * const argv[]) 1712e192b24SSimon Glass { 17264e6a49aSSam Protsenko return do_part_info(argc, argv, CMD_PART_INFO_SIZE); 1732e192b24SSimon Glass } 1742e192b24SSimon Glass 1752e192b24SSimon Glass static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 1762e192b24SSimon Glass { 1772e192b24SSimon Glass if (argc < 2) 1782e192b24SSimon Glass return CMD_RET_USAGE; 1792e192b24SSimon Glass 1802e192b24SSimon Glass if (!strcmp(argv[1], "uuid")) 1812e192b24SSimon Glass return do_part_uuid(argc - 2, argv + 2); 1822e192b24SSimon Glass else if (!strcmp(argv[1], "list")) 1832e192b24SSimon Glass return do_part_list(argc - 2, argv + 2); 1842e192b24SSimon Glass else if (!strcmp(argv[1], "start")) 1852e192b24SSimon Glass return do_part_start(argc - 2, argv + 2); 1862e192b24SSimon Glass else if (!strcmp(argv[1], "size")) 1872e192b24SSimon Glass return do_part_size(argc - 2, argv + 2); 1882e192b24SSimon Glass 1892e192b24SSimon Glass return CMD_RET_USAGE; 1902e192b24SSimon Glass } 1912e192b24SSimon Glass 1922e192b24SSimon Glass U_BOOT_CMD( 1932e192b24SSimon Glass part, CONFIG_SYS_MAXARGS, 1, do_part, 1942e192b24SSimon Glass "disk partition related commands", 1952e192b24SSimon Glass "uuid <interface> <dev>:<part>\n" 1962e192b24SSimon Glass " - print partition UUID\n" 1972e192b24SSimon Glass "part uuid <interface> <dev>:<part> <varname>\n" 1982e192b24SSimon Glass " - set environment variable to partition UUID\n" 1992e192b24SSimon Glass "part list <interface> <dev>\n" 2002e192b24SSimon Glass " - print a device's partition table\n" 2012e192b24SSimon Glass "part list <interface> <dev> [flags] <varname>\n" 2022e192b24SSimon Glass " - set environment variable to the list of partitions\n" 2032e192b24SSimon Glass " flags can be -bootable (list only bootable partitions)\n" 2042e192b24SSimon Glass "part start <interface> <dev> <part> <varname>\n" 2052e192b24SSimon Glass " - set environment variable to the start of the partition (in blocks)\n" 20636df616aSSam Protsenko " part can be either partition number or partition name\n" 2072e192b24SSimon Glass "part size <interface> <dev> <part> <varname>\n" 20836df616aSSam Protsenko " - set environment variable to the size of the partition (in blocks)\n" 20936df616aSSam Protsenko " part can be either partition number or partition name" 2102e192b24SSimon Glass ); 211