Patchwork [U-Boot,V7,09/10] COMMON: MMC: Command to support EMMC booting and to resize EMMC boot partition

login
register
mail settings
Submitter Amar
Date March 5, 2013, 1:11 p.m.
Message ID <1362489090-7745-10-git-send-email-amarendra.xt@samsung.com>
Download mbox | patch
Permalink /patch/225016/
State Changes Requested
Delegated to: Minkyu Kang
Headers show

Comments

Amar - March 5, 2013, 1:11 p.m.
This patch adds commands to access(open/close) and resize boot partitions on EMMC.

Signed-off-by: Amar <amarendra.xt@samsung.com>
Acked-by: Simon Glass <sjg@chromium.org>
---
Changes since V1:
	1)Combined the common piece of code between 'open' and 'close'
	operations.

Changes since V2:
	1)Updation of commit message and resubmition of proper patch set.

Changes since V3:
	No change.

Changes since V4:
	1)Added a new funtion boot_part_access() to combine the common parts of
	'mmc open' and 'mmc close' functionalities.
	2)Used the generic function "mmc_boot_part_access()" instead of
	two functions "mmc_boot_open()" and "mmc_boot_close()". By doing so user
	can specify which boot partition to be accessed (opened / closed).

Changes since V5:
	1)Updated minor nits in response to review comments.

Changes since V6:
	No change.

 common/cmd_mmc.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 97 insertions(+), 1 deletion(-)
Wolfgang Denk - March 5, 2013, 8:42 p.m.
Dear Amar,

In message <1362489090-7745-10-git-send-email-amarendra.xt@samsung.com> you wrote:
> This patch adds commands to access(open/close) and resize boot partitions on EMMC.
> 
> Signed-off-by: Amar <amarendra.xt@samsung.com>
> Acked-by: Simon Glass <sjg@chromium.org>

Can you please make this code conditional, so only boards that want
this feature (and actually use EMMC) suffer from the increased memory
footprint?

Thanks.

Best regards,

Wolfgang Denk
Amarendra Reddy - March 7, 2013, 9:25 a.m.
Dear Wolfgang,
Thank you for the comments.
Ok, I will make this code conditional.
I will prepare a new patch and post the same.

Thanks & Regards
Amarendra

On 6 March 2013 02:12, Wolfgang Denk <wd@denx.de> wrote:

> Dear Amar,
>
> In message <1362489090-7745-10-git-send-email-amarendra.xt@samsung.com>
> you wrote:
> > This patch adds commands to access(open/close) and resize boot
> partitions on EMMC.
> >
> > Signed-off-by: Amar <amarendra.xt@samsung.com>
> > Acked-by: Simon Glass <sjg@chromium.org>
>
> Can you please make this code conditional, so only boards that want
> this feature (and actually use EMMC) suffer from the increased memory
> footprint?
>
> Thanks.
>
> Best regards,
>
> Wolfgang Denk
>
> --
> DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
> A dog always bit deepest on the veterinary hand.
>                                     - Terry Pratchett, _Wyrd Sisters_
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>

Patch

diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c
index 7dacd51..5f2ae70 100644
--- a/common/cmd_mmc.c
+++ b/common/cmd_mmc.c
@@ -147,6 +147,31 @@  U_BOOT_CMD(
 	"- display info of the current MMC device"
 );
 
+static int boot_part_access(struct mmc *mmc, u32 ack, u32 part_num, u32 access)
+{
+	int err;
+	err = mmc_boot_part_access(mmc, ack, part_num, access);
+
+	if ((err == 0) && (access != 0)) {
+		printf("\t\t\t!!!Notice!!!\n");
+		printf("!You must close EMMC boot Partition after all"
+						"images are written\n");
+		printf("!EMMC boot partition has continuity at image"
+						"writing time.\n");
+		printf("!So, do not close the boot partition before all"
+						"images are written.\n");
+		return 0;
+	} else if ((err == 0) && (access == 0))
+		return 0;
+	else if ((err != 0) && (access != 0)) {
+		printf("EMMC boot partition-%d OPEN Failed.\n", part_num);
+		return 1;
+	} else {
+		printf("EMMC boot partition-%d CLOSE Failed.\n", part_num);
+		return 1;
+	}
+}
+
 static int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	enum mmc_state state;
@@ -248,6 +273,71 @@  static int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 				curr_device, mmc->part_num);
 
 		return 0;
+	} else if ((strcmp(argv[1], "open") == 0) ||
+			(strcmp(argv[1], "close") == 0)) {
+		int dev;
+		struct mmc *mmc;
+		u32 ack, part_num, access = 0;
+
+		if (argc == 4) {
+			dev = simple_strtoul(argv[2], NULL, 10);
+			part_num = simple_strtoul(argv[3], NULL, 10);
+		} else
+			return CMD_RET_USAGE;
+
+		mmc = find_mmc_device(dev);
+		if (!mmc) {
+			printf("no mmc device at slot %x\n", dev);
+			return 1;
+		}
+
+		if (IS_SD(mmc)) {
+			printf("SD device cannot be opened/closed\n");
+			return 1;
+		}
+
+		if ((part_num <= 0) || (part_num > MMC_NUM_BOOT_PARTITION)) {
+			printf("Invalid boot partition number:\n");
+			printf("Boot partition number cannot be <= 0\n");
+			printf("EMMC44 supports only 2 boot partitions\n");
+			return 1;
+		}
+
+		if (strcmp(argv[1], "open") == 0)
+			access = part_num; /* enable R/W access to boot part*/
+		if (strcmp(argv[1], "close") == 0)
+			access = 0; /* No access to boot partition */
+
+		/* acknowledge to be sent during boot operation */
+		ack = 1;
+		return boot_part_access(mmc, ack, part_num, access);
+
+	} else if (strcmp(argv[1], "bootpart") == 0) {
+		int dev;
+		dev = simple_strtoul(argv[2], NULL, 10);
+
+		u32 bootsize = simple_strtoul(argv[3], NULL, 10);
+		u32 rpmbsize = simple_strtoul(argv[4], NULL, 10);
+		struct mmc *mmc = find_mmc_device(dev);
+		if (!mmc) {
+			printf("no mmc device at slot %x\n", dev);
+			return 1;
+		}
+
+		if (IS_SD(mmc)) {
+			printf("It is not a EMMC device\n");
+			return 1;
+		}
+
+		if (0 == mmc_boot_partition_size_change(mmc,
+						bootsize, rpmbsize)) {
+			printf("EMMC boot partition Size %d MB\n", bootsize);
+			printf("EMMC RPMB partition Size %d MB\n", rpmbsize);
+			return 0;
+		} else {
+			printf("EMMC boot partition Size change Failed.\n");
+			return 1;
+		}
 	}
 
 	state = MMC_INVALID;
@@ -317,5 +407,11 @@  U_BOOT_CMD(
 	"mmc rescan\n"
 	"mmc part - lists available partition on current mmc device\n"
 	"mmc dev [dev] [part] - show or set current mmc device [partition]\n"
-	"mmc list - lists available devices");
+	"mmc list - lists available devices\n"
+	"mmc open <dev> <boot_partition>\n"
+	" - Enable boot_part for booting and enable R/W access of boot_part\n"
+	"mmc close <dev> <boot_partition>\n"
+	" - Enable boot_part for booting and disable access to boot_part\n"
+	"mmc bootpart <device num> <boot part size MB> <RPMB part size MB>\n"
+	" - change sizes of boot and RPMB partions of specified device\n");
 #endif