diff mbox series

[v2] cmd: gpt: Add option to write GPT partitions to environment variable

Message ID 20210226181733.19307-1-farhan.ali@broadcom.com
State Accepted
Commit 653cd92d66771cf1fbd1b7612b06a0874d316654
Delegated to: Tom Rini
Headers show
Series [v2] cmd: gpt: Add option to write GPT partitions to environment variable | expand

Commit Message

Farhan Ali Feb. 26, 2021, 6:17 p.m. UTC
This change would enhance the existing 'gpt read' command to allow
(optionally) writing of the read GPT partitions to an environment
variable in the UBOOT partitions layout format. This would allow users
to easily change the overall partition settings by editing said variable
and then using the variable in the 'gpt write' and 'gpt verify' commands.

Signed-off-by: Farhan Ali <farhan.ali@broadcom.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Heinrich Schuchardt <xypron.glpk@gmx.de>
Cc: Corneliu Doban <cdoban@broadcom.com>
Cc: Rayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>
Cc: Rasmus Villemoes <rasmus.villemoes@prevas.dk>

---
Changes for v2:
   - Checked for argv[4] existence before calling do_get_gpt_info
   - Added missing update to doc/README.gpt
---
 cmd/gpt.c      | 46 ++++++++++++++++++++++++++++++++++++++--------
 doc/README.gpt | 17 +++++++++++++++++
 2 files changed, 55 insertions(+), 8 deletions(-)

Comments

Simon Glass March 5, 2021, 4:08 a.m. UTC | #1
On Fri, 26 Feb 2021 at 13:17, Farhan Ali <farhan.ali@broadcom.com> wrote:
>
> This change would enhance the existing 'gpt read' command to allow
> (optionally) writing of the read GPT partitions to an environment
> variable in the UBOOT partitions layout format. This would allow users
> to easily change the overall partition settings by editing said variable
> and then using the variable in the 'gpt write' and 'gpt verify' commands.
>
> Signed-off-by: Farhan Ali <farhan.ali@broadcom.com>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Heinrich Schuchardt <xypron.glpk@gmx.de>
> Cc: Corneliu Doban <cdoban@broadcom.com>
> Cc: Rayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>
> Cc: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
>
> ---
> Changes for v2:
>    - Checked for argv[4] existence before calling do_get_gpt_info
>    - Added missing update to doc/README.gpt
> ---
>  cmd/gpt.c      | 46 ++++++++++++++++++++++++++++++++++++++--------
>  doc/README.gpt | 17 +++++++++++++++++
>  2 files changed, 55 insertions(+), 8 deletions(-)
>

Reviewed-by: Simon Glass <sjg@chromium.org>
Heinrich Schuchardt May 4, 2021, 2:37 p.m. UTC | #2
On 5/3/21 9:29 PM, Farhan Ali wrote:
> Hi Heinrich,
>
> I was wondering if there are any other changes necessary?

Nothing on my side.

The patch was reviewed by Simon and now is is assigned to Tom.

https://patchwork.ozlabs.org/project/uboot/patch/20210226181733.19307-1-farhan.ali@broadcom.com/

He should be able to tell you why it wasn't merged yet.

Best regards

Heinrich
>
> Thanks
>
> Farhan
>
> On Thu, Mar 4, 2021 at 8:08 PM Simon Glass <sjg@chromium.org
> <mailto:sjg@chromium.org>> wrote:
>
>     On Fri, 26 Feb 2021 at 13:17, Farhan Ali <farhan.ali@broadcom.com
>     <mailto:farhan.ali@broadcom.com>> wrote:
>     >
>     > This change would enhance the existing 'gpt read' command to allow
>     > (optionally) writing of the read GPT partitions to an environment
>     > variable in the UBOOT partitions layout format. This would allow users
>     > to easily change the overall partition settings by editing said
>     variable
>     > and then using the variable in the 'gpt write' and 'gpt verify'
>     commands.
>     >
>     > Signed-off-by: Farhan Ali <farhan.ali@broadcom.com
>     <mailto:farhan.ali@broadcom.com>>
>     > Cc: Simon Glass <sjg@chromium.org <mailto:sjg@chromium.org>>
>     > Cc: Heinrich Schuchardt <xypron.glpk@gmx.de
>     <mailto:xypron.glpk@gmx.de>>
>     > Cc: Corneliu Doban <cdoban@broadcom.com <mailto:cdoban@broadcom.com>>
>     > Cc: Rayagonda Kokatanur <rayagonda.kokatanur@broadcom.com
>     <mailto:rayagonda.kokatanur@broadcom.com>>
>     > Cc: Rasmus Villemoes <rasmus.villemoes@prevas.dk
>     <mailto:rasmus.villemoes@prevas.dk>>
>     >
>     > ---
>     > Changes for v2:
>     >    - Checked for argv[4] existence before calling do_get_gpt_info
>     >    - Added missing update to doc/README.gpt
>     > ---
>     >  cmd/gpt.c      | 46 ++++++++++++++++++++++++++++++++++++++--------
>     >  doc/README.gpt | 17 +++++++++++++++++
>     >  2 files changed, 55 insertions(+), 8 deletions(-)
>     >
>
>     Reviewed-by: Simon Glass <sjg@chromium.org <mailto:sjg@chromium.org>>
>
Tom Rini May 6, 2021, 3:02 p.m. UTC | #3
On Fri, Feb 26, 2021 at 10:17:33AM -0800, Farhan Ali wrote:

> This change would enhance the existing 'gpt read' command to allow
> (optionally) writing of the read GPT partitions to an environment
> variable in the UBOOT partitions layout format. This would allow users
> to easily change the overall partition settings by editing said variable
> and then using the variable in the 'gpt write' and 'gpt verify' commands.
> 
> Signed-off-by: Farhan Ali <farhan.ali@broadcom.com>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Heinrich Schuchardt <xypron.glpk@gmx.de>
> Cc: Corneliu Doban <cdoban@broadcom.com>
> Cc: Rayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>
> Cc: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
> Reviewed-by: Simon Glass <sjg@chromium.org>

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/cmd/gpt.c b/cmd/gpt.c
index 76a95ad..17f2b83 100644
--- a/cmd/gpt.c
+++ b/cmd/gpt.c
@@ -350,17 +350,46 @@  static int get_gpt_info(struct blk_desc *dev_desc)
 }
 
 /* a wrapper to test get_gpt_info */
-static int do_get_gpt_info(struct blk_desc *dev_desc)
+static int do_get_gpt_info(struct blk_desc *dev_desc, char * const namestr)
 {
-	int ret;
+	int numparts;
+
+	numparts = get_gpt_info(dev_desc);
+
+	if (numparts > 0) {
+		if (namestr) {
+			char disk_guid[UUID_STR_LEN + 1];
+			char *partitions_list;
+			int partlistlen;
+			int ret = -1;
+
+			ret = get_disk_guid(dev_desc, disk_guid);
+			if (ret < 0)
+				return ret;
+
+			partlistlen = calc_parts_list_len(numparts);
+			partitions_list = malloc(partlistlen);
+			if (!partitions_list) {
+				del_gpt_info();
+				return -ENOMEM;
+			}
+			memset(partitions_list, '\0', partlistlen);
+
+			ret = create_gpt_partitions_list(numparts, disk_guid,
+							 partitions_list);
+			if (ret < 0)
+				printf("Error: Could not create partition list string!\n");
+			else
+				env_set(namestr, partitions_list);
 
-	ret = get_gpt_info(dev_desc);
-	if (ret > 0) {
-		print_gpt_info();
+			free(partitions_list);
+		} else {
+			print_gpt_info();
+		}
 		del_gpt_info();
 		return 0;
 	}
-	return ret;
+	return numparts;
 }
 #endif
 
@@ -982,7 +1011,7 @@  static int do_gpt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 		ret = do_disk_guid(blk_dev_desc, argv[4]);
 #ifdef CONFIG_CMD_GPT_RENAME
 	} else if (strcmp(argv[1], "read") == 0) {
-		ret = do_get_gpt_info(blk_dev_desc);
+		ret = do_get_gpt_info(blk_dev_desc, (argc == 5) ? argv[4] : NULL);
 	} else if ((strcmp(argv[1], "swap") == 0) ||
 		   (strcmp(argv[1], "rename") == 0)) {
 		ret = do_rename_gpt_parts(blk_dev_desc, argv[1], argv[4], argv[5]);
@@ -1028,8 +1057,9 @@  U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt,
 	" gpt guid mmc 0 varname\n"
 #ifdef CONFIG_CMD_GPT_RENAME
 	"gpt partition renaming commands:\n"
-	" gpt read <interface> <dev>\n"
+	" gpt read <interface> <dev> [<varname>]\n"
 	"    - read GPT into a data structure for manipulation\n"
+	"    - read GPT partitions into environment variable\n"
 	" gpt swap <interface> <dev> <name1> <name2>\n"
 	"    - change all partitions named name1 to name2\n"
 	"      and vice-versa\n"
diff --git a/doc/README.gpt b/doc/README.gpt
index ac975f6..91e397d 100644
--- a/doc/README.gpt
+++ b/doc/README.gpt
@@ -237,6 +237,23 @@  doc/arch/index.rst:
 => gpt swap host 0 name othername
 [ . . . ]
 
+Modifying GPT partition layout from U-Boot:
+===========================================
+
+The entire GPT partition layout can be exported to an environment
+variable and then modified enmasse. Users can change the partition
+numbers, offsets, names and sizes. The resulting variable can used to
+reformat the device. Here is an example of reading the GPT partitions
+into a variable and then modifying them:
+
+U-BOOT> gpt read mmc 0 current_partitions
+U-BOOT> env edit current_partitions
+edit: uuid_disk=[...];name=part1,start=0x4000,size=0x4000,uuid=[...];
+name=part2,start=0xc000,size=0xc000,uuid=[...];[ . . . ]
+
+U-BOOT> gpt write mmc 0 $current_partitions
+U-BOOT> gpt verify mmc 0 $current_partitions
+
 Partition type GUID:
 ====================