diff mbox

[U-Boot,v2,2/3] common: cmd_part: start and size sub-commands introduction

Message ID 1434184697-23410-3-git-send-email-contact@paulk.fr
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Paul Kocialkowski June 13, 2015, 8:38 a.m. UTC
This introduces the part start and part size sub-commands. The purpose of these
is to store the start block and size of a partition in a variable, given the
device and partition number.

This allows reading raw data that fits a single partition more easily.
For instance, this could be used to figure out the start block and size of a
kernel partition when a partition table is present, given the partition number.

Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
---
 common/cmd_part.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 65 insertions(+), 1 deletion(-)

Comments

Stephen Warren June 15, 2015, 2:59 p.m. UTC | #1
On 06/13/2015 02:38 AM, Paul Kocialkowski wrote:
> This introduces the part start and part size sub-commands. The purpose of these
> is to store the start block and size of a partition in a variable, given the
> device and partition number.
>
> This allows reading raw data that fits a single partition more easily.
> For instance, this could be used to figure out the start block and size of a
> kernel partition when a partition table is present, given the partition number.

Patches 1 and 2,
Acked-by: Stephen Warren <swarren@nvidia.com>

One minor comment here though:

> diff --git a/common/cmd_part.c b/common/cmd_part.c

> +static int do_part_start(int argc, char * const argv[])

> +	if (argc < 4)
> +		return CMD_RET_USAGE;
...
> +	snprintf(buf, sizeof(buf), "0x%lx", info.start);
> +	setenv(argv[3], buf);

It would be nice if the variable name parameter to this command (and 
part size) were optional, just like it is in "part uuid". This would 
make it simpler to run the command interactively while experimenting.
Tom Rini June 15, 2015, 4:02 p.m. UTC | #2
On Mon, Jun 15, 2015 at 08:59:47AM -0600, Stephen Warren wrote:
> On 06/13/2015 02:38 AM, Paul Kocialkowski wrote:
> >This introduces the part start and part size sub-commands. The purpose of these
> >is to store the start block and size of a partition in a variable, given the
> >device and partition number.
> >
> >This allows reading raw data that fits a single partition more easily.
> >For instance, this could be used to figure out the start block and size of a
> >kernel partition when a partition table is present, given the partition number.
> 
> Patches 1 and 2,
> Acked-by: Stephen Warren <swarren@nvidia.com>
> 
> One minor comment here though:
> 
> >diff --git a/common/cmd_part.c b/common/cmd_part.c
> 
> >+static int do_part_start(int argc, char * const argv[])
> 
> >+	if (argc < 4)
> >+		return CMD_RET_USAGE;
> ...
> >+	snprintf(buf, sizeof(buf), "0x%lx", info.start);
> >+	setenv(argv[3], buf);
> 
> It would be nice if the variable name parameter to this command (and
> part size) were optional, just like it is in "part uuid". This would
> make it simpler to run the command interactively while
> experimenting.

Yes.  Also numbers are hex by default in U-Boot so we don't need the 0x
here.
Paul Kocialkowski June 15, 2015, 4:13 p.m. UTC | #3
Le lundi 15 juin 2015 à 08:59 -0600, Stephen Warren a écrit :
> On 06/13/2015 02:38 AM, Paul Kocialkowski wrote:
> > This introduces the part start and part size sub-commands. The purpose of these
> > is to store the start block and size of a partition in a variable, given the
> > device and partition number.
> >
> > This allows reading raw data that fits a single partition more easily.
> > For instance, this could be used to figure out the start block and size of a
> > kernel partition when a partition table is present, given the partition number.
> 
> Patches 1 and 2,
> Acked-by: Stephen Warren <swarren@nvidia.com>
> 
> One minor comment here though:
> 
> > diff --git a/common/cmd_part.c b/common/cmd_part.c
> 
> > +static int do_part_start(int argc, char * const argv[])
> 
> > +	if (argc < 4)
> > +		return CMD_RET_USAGE;
> ...
> > +	snprintf(buf, sizeof(buf), "0x%lx", info.start);
> > +	setenv(argv[3], buf);
> 
> It would be nice if the variable name parameter to this command (and 
> part size) were optional, just like it is in "part uuid". This would 
> make it simpler to run the command interactively while experimenting.

Sure, that wouldn't hurt!

Thanks for the review.
Paul Kocialkowski June 15, 2015, 7:36 p.m. UTC | #4
Le lundi 15 juin 2015 à 12:02 -0400, Tom Rini a écrit :
> On Mon, Jun 15, 2015 at 08:59:47AM -0600, Stephen Warren wrote:
> > On 06/13/2015 02:38 AM, Paul Kocialkowski wrote:
> > >This introduces the part start and part size sub-commands. The purpose of these
> > >is to store the start block and size of a partition in a variable, given the
> > >device and partition number.
> > >
> > >This allows reading raw data that fits a single partition more easily.
> > >For instance, this could be used to figure out the start block and size of a
> > >kernel partition when a partition table is present, given the partition number.
> > 
> > Patches 1 and 2,
> > Acked-by: Stephen Warren <swarren@nvidia.com>
> > 
> > One minor comment here though:
> > 
> > >diff --git a/common/cmd_part.c b/common/cmd_part.c
> > 
> > >+static int do_part_start(int argc, char * const argv[])
> > 
> > >+	if (argc < 4)
> > >+		return CMD_RET_USAGE;
> > ...
> > >+	snprintf(buf, sizeof(buf), "0x%lx", info.start);
> > >+	setenv(argv[3], buf);
> > 
> > It would be nice if the variable name parameter to this command (and
> > part size) were optional, just like it is in "part uuid". This would
> > make it simpler to run the command interactively while
> > experimenting.
> 
> Yes.  Also numbers are hex by default in U-Boot so we don't need the 0x
> here.

Thanks for the reminder. v3 doesn't include the 0x.
diff mbox

Patch

diff --git a/common/cmd_part.c b/common/cmd_part.c
index 4bdbf90..7212ba6 100644
--- a/common/cmd_part.c
+++ b/common/cmd_part.c
@@ -112,6 +112,62 @@  static int do_part_list(int argc, char * const argv[])
 	return 0;
 }
 
+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 < 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), "0x%lx", info.start);
+	setenv(argv[3], buf);
+
+	return 0;
+}
+
+static int do_part_size(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 < 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), "0x%lx", info.size);
+	setenv(argv[3], buf);
+
+	return 0;
+}
+
 static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	if (argc < 2)
@@ -121,6 +177,10 @@  static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 		return do_part_uuid(argc - 2, argv + 2);
 	else if (!strcmp(argv[1], "list"))
 		return do_part_list(argc - 2, argv + 2);
+	else if (!strcmp(argv[1], "start"))
+		return do_part_start(argc - 2, argv + 2);
+	else if (!strcmp(argv[1], "size"))
+		return do_part_size(argc - 2, argv + 2);
 
 	return CMD_RET_USAGE;
 }
@@ -136,5 +196,9 @@  U_BOOT_CMD(
 	"    - print a device's partition table\n"
 	"part list <interface> <dev> [flags] <varname>\n"
 	"    - set environment variable to the list of partitions\n"
-	"      flags can be -bootable (list only bootable partitions)"
+	"      flags can be -bootable (list only bootable partitions)\n"
+	"part start <interface> <dev> <part> <varname>\n"
+	"    - set environment variable to the start of the partition (in blocks)\n"
+	"part size <interface> <dev> <part> <varname>\n"
+	"    - set environment variable to the size of the partition (in blocks)"
 );