1*2e192b24SSimon Glass /* 2*2e192b24SSimon Glass * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. 3*2e192b24SSimon Glass * 4*2e192b24SSimon Glass * made from cmd_ext2, which was: 5*2e192b24SSimon Glass * 6*2e192b24SSimon Glass * (C) Copyright 2004 7*2e192b24SSimon Glass * esd gmbh <www.esd-electronics.com> 8*2e192b24SSimon Glass * Reinhard Arlt <reinhard.arlt@esd-electronics.com> 9*2e192b24SSimon Glass * 10*2e192b24SSimon Glass * made from cmd_reiserfs by 11*2e192b24SSimon Glass * 12*2e192b24SSimon Glass * (C) Copyright 2003 - 2004 13*2e192b24SSimon Glass * Sysgo Real-Time Solutions, AG <www.elinos.com> 14*2e192b24SSimon Glass * Pavel Bartusek <pba@sysgo.com> 15*2e192b24SSimon Glass * 16*2e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 17*2e192b24SSimon Glass */ 18*2e192b24SSimon Glass 19*2e192b24SSimon Glass #include <common.h> 20*2e192b24SSimon Glass #include <config.h> 21*2e192b24SSimon Glass #include <command.h> 22*2e192b24SSimon Glass #include <part.h> 23*2e192b24SSimon Glass #include <vsprintf.h> 24*2e192b24SSimon Glass 25*2e192b24SSimon Glass #ifndef CONFIG_PARTITION_UUIDS 26*2e192b24SSimon Glass #error CONFIG_PARTITION_UUIDS must be enabled for CONFIG_CMD_PART to be enabled 27*2e192b24SSimon Glass #endif 28*2e192b24SSimon Glass 29*2e192b24SSimon Glass static int do_part_uuid(int argc, char * const argv[]) 30*2e192b24SSimon Glass { 31*2e192b24SSimon Glass int part; 32*2e192b24SSimon Glass block_dev_desc_t *dev_desc; 33*2e192b24SSimon Glass disk_partition_t info; 34*2e192b24SSimon Glass 35*2e192b24SSimon Glass if (argc < 2) 36*2e192b24SSimon Glass return CMD_RET_USAGE; 37*2e192b24SSimon Glass if (argc > 3) 38*2e192b24SSimon Glass return CMD_RET_USAGE; 39*2e192b24SSimon Glass 40*2e192b24SSimon Glass part = get_device_and_partition(argv[0], argv[1], &dev_desc, &info, 0); 41*2e192b24SSimon Glass if (part < 0) 42*2e192b24SSimon Glass return 1; 43*2e192b24SSimon Glass 44*2e192b24SSimon Glass if (argc > 2) 45*2e192b24SSimon Glass setenv(argv[2], info.uuid); 46*2e192b24SSimon Glass else 47*2e192b24SSimon Glass printf("%s\n", info.uuid); 48*2e192b24SSimon Glass 49*2e192b24SSimon Glass return 0; 50*2e192b24SSimon Glass } 51*2e192b24SSimon Glass 52*2e192b24SSimon Glass static int do_part_list(int argc, char * const argv[]) 53*2e192b24SSimon Glass { 54*2e192b24SSimon Glass int ret; 55*2e192b24SSimon Glass block_dev_desc_t *desc; 56*2e192b24SSimon Glass char *var = NULL; 57*2e192b24SSimon Glass bool bootable = false; 58*2e192b24SSimon Glass int i; 59*2e192b24SSimon Glass 60*2e192b24SSimon Glass if (argc < 2) 61*2e192b24SSimon Glass return CMD_RET_USAGE; 62*2e192b24SSimon Glass 63*2e192b24SSimon Glass if (argc > 2) { 64*2e192b24SSimon Glass for (i = 2; i < argc ; i++) { 65*2e192b24SSimon Glass if (argv[i][0] == '-') { 66*2e192b24SSimon Glass if (!strcmp(argv[i], "-bootable")) { 67*2e192b24SSimon Glass bootable = true; 68*2e192b24SSimon Glass } else { 69*2e192b24SSimon Glass printf("Unknown option %s\n", argv[i]); 70*2e192b24SSimon Glass return CMD_RET_USAGE; 71*2e192b24SSimon Glass } 72*2e192b24SSimon Glass } else { 73*2e192b24SSimon Glass var = argv[i]; 74*2e192b24SSimon Glass break; 75*2e192b24SSimon Glass } 76*2e192b24SSimon Glass } 77*2e192b24SSimon Glass 78*2e192b24SSimon Glass /* Loops should have been exited at the last argument, which 79*2e192b24SSimon Glass * as it contained the variable */ 80*2e192b24SSimon Glass if (argc != i + 1) 81*2e192b24SSimon Glass return CMD_RET_USAGE; 82*2e192b24SSimon Glass } 83*2e192b24SSimon Glass 84*2e192b24SSimon Glass ret = get_device(argv[0], argv[1], &desc); 85*2e192b24SSimon Glass if (ret < 0) 86*2e192b24SSimon Glass return 1; 87*2e192b24SSimon Glass 88*2e192b24SSimon Glass if (var != NULL) { 89*2e192b24SSimon Glass int p; 90*2e192b24SSimon Glass char str[512] = { '\0', }; 91*2e192b24SSimon Glass disk_partition_t info; 92*2e192b24SSimon Glass 93*2e192b24SSimon Glass for (p = 1; p < 128; p++) { 94*2e192b24SSimon Glass char t[5]; 95*2e192b24SSimon Glass int r = get_partition_info(desc, p, &info); 96*2e192b24SSimon Glass 97*2e192b24SSimon Glass if (r != 0) 98*2e192b24SSimon Glass continue; 99*2e192b24SSimon Glass 100*2e192b24SSimon Glass if (bootable && !info.bootable) 101*2e192b24SSimon Glass continue; 102*2e192b24SSimon Glass 103*2e192b24SSimon Glass sprintf(t, "%s%x", str[0] ? " " : "", p); 104*2e192b24SSimon Glass strcat(str, t); 105*2e192b24SSimon Glass } 106*2e192b24SSimon Glass setenv(var, str); 107*2e192b24SSimon Glass return 0; 108*2e192b24SSimon Glass } 109*2e192b24SSimon Glass 110*2e192b24SSimon Glass print_part(desc); 111*2e192b24SSimon Glass 112*2e192b24SSimon Glass return 0; 113*2e192b24SSimon Glass } 114*2e192b24SSimon Glass 115*2e192b24SSimon Glass static int do_part_start(int argc, char * const argv[]) 116*2e192b24SSimon Glass { 117*2e192b24SSimon Glass block_dev_desc_t *desc; 118*2e192b24SSimon Glass disk_partition_t info; 119*2e192b24SSimon Glass char buf[512] = { 0 }; 120*2e192b24SSimon Glass int part; 121*2e192b24SSimon Glass int err; 122*2e192b24SSimon Glass int ret; 123*2e192b24SSimon Glass 124*2e192b24SSimon Glass if (argc < 3) 125*2e192b24SSimon Glass return CMD_RET_USAGE; 126*2e192b24SSimon Glass if (argc > 4) 127*2e192b24SSimon Glass return CMD_RET_USAGE; 128*2e192b24SSimon Glass 129*2e192b24SSimon Glass part = simple_strtoul(argv[2], NULL, 0); 130*2e192b24SSimon Glass 131*2e192b24SSimon Glass ret = get_device(argv[0], argv[1], &desc); 132*2e192b24SSimon Glass if (ret < 0) 133*2e192b24SSimon Glass return 1; 134*2e192b24SSimon Glass 135*2e192b24SSimon Glass err = get_partition_info(desc, part, &info); 136*2e192b24SSimon Glass if (err) 137*2e192b24SSimon Glass return 1; 138*2e192b24SSimon Glass 139*2e192b24SSimon Glass snprintf(buf, sizeof(buf), LBAF, info.start); 140*2e192b24SSimon Glass 141*2e192b24SSimon Glass if (argc > 3) 142*2e192b24SSimon Glass setenv(argv[3], buf); 143*2e192b24SSimon Glass else 144*2e192b24SSimon Glass printf("%s\n", buf); 145*2e192b24SSimon Glass 146*2e192b24SSimon Glass return 0; 147*2e192b24SSimon Glass } 148*2e192b24SSimon Glass 149*2e192b24SSimon Glass static int do_part_size(int argc, char * const argv[]) 150*2e192b24SSimon Glass { 151*2e192b24SSimon Glass block_dev_desc_t *desc; 152*2e192b24SSimon Glass disk_partition_t info; 153*2e192b24SSimon Glass char buf[512] = { 0 }; 154*2e192b24SSimon Glass int part; 155*2e192b24SSimon Glass int err; 156*2e192b24SSimon Glass int ret; 157*2e192b24SSimon Glass 158*2e192b24SSimon Glass if (argc < 3) 159*2e192b24SSimon Glass return CMD_RET_USAGE; 160*2e192b24SSimon Glass if (argc > 4) 161*2e192b24SSimon Glass return CMD_RET_USAGE; 162*2e192b24SSimon Glass 163*2e192b24SSimon Glass part = simple_strtoul(argv[2], NULL, 0); 164*2e192b24SSimon Glass 165*2e192b24SSimon Glass ret = get_device(argv[0], argv[1], &desc); 166*2e192b24SSimon Glass if (ret < 0) 167*2e192b24SSimon Glass return 1; 168*2e192b24SSimon Glass 169*2e192b24SSimon Glass err = get_partition_info(desc, part, &info); 170*2e192b24SSimon Glass if (err) 171*2e192b24SSimon Glass return 1; 172*2e192b24SSimon Glass 173*2e192b24SSimon Glass snprintf(buf, sizeof(buf), LBAF, info.size); 174*2e192b24SSimon Glass 175*2e192b24SSimon Glass if (argc > 3) 176*2e192b24SSimon Glass setenv(argv[3], buf); 177*2e192b24SSimon Glass else 178*2e192b24SSimon Glass printf("%s\n", buf); 179*2e192b24SSimon Glass 180*2e192b24SSimon Glass return 0; 181*2e192b24SSimon Glass } 182*2e192b24SSimon Glass 183*2e192b24SSimon Glass static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 184*2e192b24SSimon Glass { 185*2e192b24SSimon Glass if (argc < 2) 186*2e192b24SSimon Glass return CMD_RET_USAGE; 187*2e192b24SSimon Glass 188*2e192b24SSimon Glass if (!strcmp(argv[1], "uuid")) 189*2e192b24SSimon Glass return do_part_uuid(argc - 2, argv + 2); 190*2e192b24SSimon Glass else if (!strcmp(argv[1], "list")) 191*2e192b24SSimon Glass return do_part_list(argc - 2, argv + 2); 192*2e192b24SSimon Glass else if (!strcmp(argv[1], "start")) 193*2e192b24SSimon Glass return do_part_start(argc - 2, argv + 2); 194*2e192b24SSimon Glass else if (!strcmp(argv[1], "size")) 195*2e192b24SSimon Glass return do_part_size(argc - 2, argv + 2); 196*2e192b24SSimon Glass 197*2e192b24SSimon Glass return CMD_RET_USAGE; 198*2e192b24SSimon Glass } 199*2e192b24SSimon Glass 200*2e192b24SSimon Glass U_BOOT_CMD( 201*2e192b24SSimon Glass part, CONFIG_SYS_MAXARGS, 1, do_part, 202*2e192b24SSimon Glass "disk partition related commands", 203*2e192b24SSimon Glass "uuid <interface> <dev>:<part>\n" 204*2e192b24SSimon Glass " - print partition UUID\n" 205*2e192b24SSimon Glass "part uuid <interface> <dev>:<part> <varname>\n" 206*2e192b24SSimon Glass " - set environment variable to partition UUID\n" 207*2e192b24SSimon Glass "part list <interface> <dev>\n" 208*2e192b24SSimon Glass " - print a device's partition table\n" 209*2e192b24SSimon Glass "part list <interface> <dev> [flags] <varname>\n" 210*2e192b24SSimon Glass " - set environment variable to the list of partitions\n" 211*2e192b24SSimon Glass " flags can be -bootable (list only bootable partitions)\n" 212*2e192b24SSimon Glass "part start <interface> <dev> <part> <varname>\n" 213*2e192b24SSimon Glass " - set environment variable to the start of the partition (in blocks)\n" 214*2e192b24SSimon Glass "part size <interface> <dev> <part> <varname>\n" 215*2e192b24SSimon Glass " - set environment variable to the size of the partition (in blocks)" 216*2e192b24SSimon Glass ); 217