From patchwork Fri Feb 26 18:17:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Farhan Ali X-Patchwork-Id: 1445063 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.a=rsa-sha256 header.s=dkimrelay header.b=PrDC6cVT; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DnHvS5KsTz9sRN for ; Sat, 27 Feb 2021 05:17:56 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 6D7E98120B; Fri, 26 Feb 2021 19:17:46 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.b="PrDC6cVT"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id CD40E8179D; Fri, 26 Feb 2021 19:17:44 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from relay.smtp-ext.broadcom.com (relay.smtp-ext.broadcom.com [192.19.232.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 6943E80EFF for ; Fri, 26 Feb 2021 19:17:41 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: phobos.denx.de; spf=fail smtp.mailfrom=farhan.ali@broadcom.com Received: from bld-lvn-bcawlan-34.lvn.broadcom.net (bld-lvn-bcawlan-34.lvn.broadcom.net [10.75.138.137]) by relay.smtp-ext.broadcom.com (Postfix) with ESMTP id F15297FC9; Fri, 26 Feb 2021 10:17:38 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 relay.smtp-ext.broadcom.com F15297FC9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1614363459; bh=OVgp0fRMHnFE60/2+WukJMWsuPdW10bm1mRJKWCX79w=; h=From:To:Cc:Subject:Date:From; b=PrDC6cVTPYdwwZKbtC8V17hR3fX2FBI3bwgxcHQlauCBbAO8X0DC9m94na9D2cdxZ zW7TuT5Tw1hAcD6g2M2Z/cP9JIBX0bsqA0NJwWv+5Uj/guiVSAu0YET9PydH+Umdnb avMFFpklS9KXHQp38TZrAGIVbfqdMiinfMsvdgSw= Received: from xl-irv-13.lvn.broadcom.net (xl-irv-13.lvn.broadcom.net [10.75.135.159]) by bld-lvn-bcawlan-34.lvn.broadcom.net (Postfix) with ESMTPSA id AA0C1187289; Fri, 26 Feb 2021 10:17:38 -0800 (PST) From: Farhan Ali To: u-boot@lists.denx.de Cc: Farhan Ali , Simon Glass , Heinrich Schuchardt , Corneliu Doban , Rayagonda Kokatanur , Rasmus Villemoes Subject: [PATCH v2] cmd: gpt: Add option to write GPT partitions to environment variable Date: Fri, 26 Feb 2021 10:17:33 -0800 Message-Id: <20210226181733.19307-1-farhan.ali@broadcom.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.4 at phobos.denx.de X-Virus-Status: Clean 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 Cc: Simon Glass Cc: Heinrich Schuchardt Cc: Corneliu Doban Cc: Rayagonda Kokatanur Cc: Rasmus Villemoes Reviewed-by: Simon Glass --- 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(-) 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 \n" + " gpt read []\n" " - read GPT into a data structure for manipulation\n" + " - read GPT partitions into environment variable\n" " gpt swap \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: ====================