xref: /OK3568_Linux_fs/u-boot/cmd/android_cmds.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2017 The Android Open Source Project
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier: BSD-2-Clause
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <android_cmds.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <common.h>
10*4882a593Smuzhiyun #include <part.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun /**
13*4882a593Smuzhiyun  * part_get_info_by_dev_and_name - Parse a device number and partition name
14*4882a593Smuzhiyun  * string in the form of "device_num;partition_name", for example "0;misc".
15*4882a593Smuzhiyun  * If the partition is found, sets dev_desc and part_info accordingly with the
16*4882a593Smuzhiyun  * information of the partition with the given partition_name.
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  * @dev_iface:		Device interface.
19*4882a593Smuzhiyun  * @dev_part_str:	Input string argument, like "0;misc".
20*4882a593Smuzhiyun  * @dev_desc:		Place to store the device description pointer.
21*4882a593Smuzhiyun  * @part_info:		Place to store the partition information.
22*4882a593Smuzhiyun  * @return 0 on success, or -1 on error
23*4882a593Smuzhiyun  */
part_get_info_by_dev_and_name(const char * dev_iface,const char * dev_part_str,struct blk_desc ** dev_desc,disk_partition_t * part_info)24*4882a593Smuzhiyun static int part_get_info_by_dev_and_name(const char *dev_iface,
25*4882a593Smuzhiyun 					 const char *dev_part_str,
26*4882a593Smuzhiyun 					 struct blk_desc **dev_desc,
27*4882a593Smuzhiyun 					 disk_partition_t *part_info)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun 	char *ep;
30*4882a593Smuzhiyun 	const char *part_str;
31*4882a593Smuzhiyun 	int dev_num;
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun 	part_str = strchr(dev_part_str, ';');
34*4882a593Smuzhiyun 	if (!part_str || part_str == dev_part_str)
35*4882a593Smuzhiyun 		return -1;
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 	dev_num = simple_strtoul(dev_part_str, &ep, 16);
38*4882a593Smuzhiyun 	if (ep != part_str) {
39*4882a593Smuzhiyun 		/* Not all the first part before the ; was parsed. */
40*4882a593Smuzhiyun 		return -1;
41*4882a593Smuzhiyun 	}
42*4882a593Smuzhiyun 	part_str++;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	*dev_desc = blk_get_dev(dev_iface, dev_num);
45*4882a593Smuzhiyun 	if (!*dev_desc) {
46*4882a593Smuzhiyun 		printf("Could not find %s %d\n", dev_iface, dev_num);
47*4882a593Smuzhiyun 		return -1;
48*4882a593Smuzhiyun 	}
49*4882a593Smuzhiyun 	if (part_get_info_by_name(*dev_desc, part_str, part_info) < 0) {
50*4882a593Smuzhiyun 		printf("Could not find \"%s\" partition\n", part_str);
51*4882a593Smuzhiyun 		return -1;
52*4882a593Smuzhiyun 	}
53*4882a593Smuzhiyun 	return 0;
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun 
part_get_info_by_dev_and_name_or_num(const char * dev_iface,const char * dev_part_str,struct blk_desc ** dev_desc,disk_partition_t * part_info)56*4882a593Smuzhiyun int part_get_info_by_dev_and_name_or_num(const char *dev_iface,
57*4882a593Smuzhiyun 					 const char *dev_part_str,
58*4882a593Smuzhiyun 					 struct blk_desc **dev_desc,
59*4882a593Smuzhiyun 					 disk_partition_t *part_info) {
60*4882a593Smuzhiyun 	/* Split the part_name if passed as "$dev_num;part_name". */
61*4882a593Smuzhiyun 	if (!part_get_info_by_dev_and_name(dev_iface, dev_part_str,
62*4882a593Smuzhiyun 					   dev_desc, part_info))
63*4882a593Smuzhiyun 		return 0;
64*4882a593Smuzhiyun 	/* Couldn't lookup by name, try looking up the partition description
65*4882a593Smuzhiyun 	 * directly.
66*4882a593Smuzhiyun 	 */
67*4882a593Smuzhiyun 	if (blk_get_device_part_str(dev_iface, dev_part_str,
68*4882a593Smuzhiyun 				    dev_desc, part_info, 1) < 0) {
69*4882a593Smuzhiyun 		printf("Couldn't find partition %s %s\n",
70*4882a593Smuzhiyun 		       dev_iface, dev_part_str);
71*4882a593Smuzhiyun 		return -1;
72*4882a593Smuzhiyun 	}
73*4882a593Smuzhiyun 	return 0;
74*4882a593Smuzhiyun }
75