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