diff mbox

[U-Boot,2/3] cmd_partuuid: add command to retrieve a partition's UUID

Message ID 1345158942-31512-2-git-send-email-swarren@wwwdotorg.org
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Stephen Warren Aug. 16, 2012, 11:15 p.m. UTC
From: Stephen Warren <swarren@nvidia.com>

This implements the following:

partuuid mmc 0:1
  -> prints the partition's UUID.
partuuic mmc 0:1 uuid
  -> sets environment variable "uuid" to the partition's UUID.

This can be useful when writing a bootcmd which searches all known
devices for something bootable, and then wants the kernel to use the
same partition as the root device, e.g.:

partuuid ${devtype} ${devnum}:${rootpart} uuid
setenv bootargs root=PARTUUID=${uuid} ...

Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 common/Makefile       |    1 +
 common/cmd_partuuid.c |   87 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 0 deletions(-)
 create mode 100644 common/cmd_partuuid.c

Comments

Stephen Warren Aug. 16, 2012, 11:21 p.m. UTC | #1
On 08/16/2012 05:15 PM, Stephen Warren wrote:
> This implements the following:
> 
> partuuid mmc 0:1
>   -> prints the partition's UUID.
> partuuic mmc 0:1 uuid
>   -> sets environment variable "uuid" to the partition's UUID.
> 
> This can be useful when writing a bootcmd which searches all known
> devices for something bootable, and then wants the kernel to use the
> same partition as the root device, e.g.:
> 
> partuuid ${devtype} ${devnum}:${rootpart} uuid
> setenv bootargs root=PARTUUID=${uuid} ...

I guess one thing I might mention here:

I can imagine other partition-oriented commands existing, e.g. a command
to find the bootable partition on a particular storage device. I'm not
sure if we should create a single "part" command with various
sub-options for this, e.g.:

part uuid mmc 0:1
part get-bootable mmc 0

or create separate commands:

partuuid mmc 0:1
part-get-bootable mmc 0
Łukasz Majewski Aug. 17, 2012, 6:46 a.m. UTC | #2
Hi Stephen,

> On 08/16/2012 05:15 PM, Stephen Warren wrote:
> > This implements the following:
> > 
> > partuuid mmc 0:1
> >   -> prints the partition's UUID.
> > partuuic mmc 0:1 uuid
> >   -> sets environment variable "uuid" to the partition's UUID.
> > 
> > This can be useful when writing a bootcmd which searches all known
> > devices for something bootable, and then wants the kernel to use the
> > same partition as the root device, e.g.:
> > 
> > partuuid ${devtype} ${devnum}:${rootpart} uuid
> > setenv bootargs root=PARTUUID=${uuid} ...
> 
> I guess one thing I might mention here:
> 
> I can imagine other partition-oriented commands existing, e.g. a
> command to find the bootable partition on a particular storage
> device. I'm not sure if we should create a single "part" command with
> various sub-options for this, e.g.:
> 
> part uuid mmc 0:1
> part get-bootable mmc 0
> 

I'm now working at restoring the GPT (GUID Partition Table) at MMC in
u-boot.

I plan to implement a separate command - gptrestore 
However, I think that one single command would be more suitable for
this purpose.

> or create separate commands:
> 
> partuuid mmc 0:1
> part-get-bootable mmc 0
Stephen Warren Aug. 17, 2012, 3:08 p.m. UTC | #3
On 08/17/2012 12:46 AM, Lukasz Majewski wrote:
> Hi Stephen,
> 
>> On 08/16/2012 05:15 PM, Stephen Warren wrote:
>>> This implements the following:
>>>
>>> partuuid mmc 0:1
>>>   -> prints the partition's UUID.
>>> partuuic mmc 0:1 uuid
>>>   -> sets environment variable "uuid" to the partition's UUID.
>>>
>>> This can be useful when writing a bootcmd which searches all known
>>> devices for something bootable, and then wants the kernel to use the
>>> same partition as the root device, e.g.:
>>>
>>> partuuid ${devtype} ${devnum}:${rootpart} uuid
>>> setenv bootargs root=PARTUUID=${uuid} ...
>>
>> I guess one thing I might mention here:
>>
>> I can imagine other partition-oriented commands existing, e.g. a
>> command to find the bootable partition on a particular storage
>> device. I'm not sure if we should create a single "part" command with
>> various sub-options for this, e.g.:
>>
>> part uuid mmc 0:1
>> part get-bootable mmc 0
> 
> I'm now working at restoring the GPT (GUID Partition Table) at MMC in
> u-boot.
> 
> I plan to implement a separate command - gptrestore 
> However, I think that one single command would be more suitable for
> this purpose.

What will gptrestore do?
Łukasz Majewski Aug. 17, 2012, 3:21 p.m. UTC | #4
On Fri, 17 Aug 2012 09:08:16 -0600
Stephen Warren <swarren@wwwdotorg.org> wrote:

> On 08/17/2012 12:46 AM, Lukasz Majewski wrote:
> > Hi Stephen,
> > 
> >> On 08/16/2012 05:15 PM, Stephen Warren wrote:
> >>> This implements the following:
> >>>
> >>> partuuid mmc 0:1
> >>>   -> prints the partition's UUID.
> >>> partuuic mmc 0:1 uuid
> >>>   -> sets environment variable "uuid" to the partition's UUID.
> >>>
> >>> This can be useful when writing a bootcmd which searches all known
> >>> devices for something bootable, and then wants the kernel to use
> >>> the same partition as the root device, e.g.:
> >>>
> >>> partuuid ${devtype} ${devnum}:${rootpart} uuid
> >>> setenv bootargs root=PARTUUID=${uuid} ...
> >>
> >> I guess one thing I might mention here:
> >>
> >> I can imagine other partition-oriented commands existing, e.g. a
> >> command to find the bootable partition on a particular storage
> >> device. I'm not sure if we should create a single "part" command
> >> with various sub-options for this, e.g.:
> >>
> >> part uuid mmc 0:1
> >> part get-bootable mmc 0
> > 
> > I'm now working at restoring the GPT (GUID Partition Table) at MMC
> > in u-boot.
> > 
> > I plan to implement a separate command - gptrestore 
> > However, I think that one single command would be more suitable for
> > this purpose.
> 
> What will gptrestore do?
> 

It will write a GPT table on the eMMC memory.
Definitions for partitions are read from u-boot environment variable.
diff mbox

Patch

diff --git a/common/Makefile b/common/Makefile
index 483eb4d..bc39997 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -129,6 +129,7 @@  COBJS-$(CONFIG_CMD_NAND) += cmd_nand.o
 COBJS-$(CONFIG_CMD_NET) += cmd_net.o
 COBJS-$(CONFIG_CMD_ONENAND) += cmd_onenand.o
 COBJS-$(CONFIG_CMD_OTP) += cmd_otp.o
+COBJS-$(CONFIG_CMD_PARTUUID) += cmd_partuuid.o
 ifdef CONFIG_PCI
 COBJS-$(CONFIG_CMD_PCI) += cmd_pci.o
 endif
diff --git a/common/cmd_partuuid.c b/common/cmd_partuuid.c
new file mode 100644
index 0000000..c85606c
--- /dev/null
+++ b/common/cmd_partuuid.c
@@ -0,0 +1,87 @@ 
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * made from cmd_ext2, which was:
+ *
+ * (C) Copyright 2004
+ * esd gmbh <www.esd-electronics.com>
+ * Reinhard Arlt <reinhard.arlt@esd-electronics.com>
+ *
+ * made from cmd_reiserfs by
+ *
+ * (C) Copyright 2003 - 2004
+ * Sysgo Real-Time Solutions, AG <www.elinos.com>
+ * Pavel Bartusek <pba@sysgo.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <common.h>
+#include <config.h>
+#include <command.h>
+#include <part.h>
+#include <vsprintf.h>
+
+int do_partuuid(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	int dev;
+	int part;
+	char *ep;
+	block_dev_desc_t *dev_desc;
+	disk_partition_t info;
+
+	if (argc < 3)
+		return CMD_RET_USAGE;
+
+	dev = (int)simple_strtoul(argv[2], &ep, 16);
+	dev_desc = get_dev(argv[1], dev);
+	if (dev_desc == NULL) {
+		printf("Block device %s %d not supported\n", argv[1], dev);
+		return 1;
+	}
+
+	if (*ep) {
+		if (*ep != ':') {
+			puts("Invalid device; use dev[:part]\n");
+			return 1;
+		}
+		part = (int)simple_strtoul(++ep, NULL, 16);
+	} else {
+		part = 1;
+	}
+
+	if (get_partition_info(dev_desc, part, &info)) {
+		printf("Bad partition %d\n", part);
+		return 1;
+	}
+
+	if (argc > 3)
+		setenv(argv[3], info.uuid);
+	else
+		printf("%s\n", info.uuid);
+
+	return 0;
+}
+
+U_BOOT_CMD(
+	partuuid,	4,	1,	do_partuuid,
+	"partition UUID retrieval",
+	"<interface> <dev[:part]>\n"
+	"    - show filesystem UUID of specified partition"
+	"<interface> <dev[:part]> <varname>\n"
+	"    - write filesystem UUID to environmane variable"
+);