Patchwork [U-Boot,9/9] COMMON: MMC: Command to support EMMC booting

login
register
mail settings
Submitter Amar
Date Dec. 28, 2012, 3:52 p.m.
Message ID <1356709972-26549-10-git-send-email-amarendra.xt@samsung.com>
Download mbox | patch
Permalink /patch/208500/
State Changes Requested
Delegated to: Minkyu Kang
Headers show

Comments

Wolfgang Denk - Dec. 28, 2012, 3:41 p.m.
Dear Amar,

In message <1356709972-26549-10-git-send-email-amarendra.xt@samsung.com> you wrote:
> This patch adds commands to open, close and create partitions on EMMC

In which way are partitions on MC devices special, compare to
partitions on other storage devies?

I mean, does it reeally make sense to create a (E?) MMC specific
command here, instead of providing general partition support hat can
also be used on other storage devices?

Best regards,

Wolfgang Denk
Amar - Dec. 28, 2012, 3:52 p.m.
This patch adds commands to open, close and create partitions on EMMC

Signed-off-by: Amar <amarendra.xt@samsung.com>
---
 common/cmd_mmc.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 84 insertions(+), 1 deletion(-)
Amarendra Reddy - Jan. 4, 2013, 9:29 a.m.
Dear Wolfgang,

Thanks for the review comments.
I would like to clarify that this patch resizes EMMC partitions. But does
not create partitions.
I think the statement *"..close and create partitions on EMMC"* was
misleading, which I corrected in latest patch set.

The EMMC4.4 chips are provided with 2 boot partitons and 1 RPMB partition.
This patch merely deals with resizing Boot partitions & RPMB partition, by
sending proper commands to EMMC chip.

Thanks & Regards
Amarendra Reddy.

On 28 December 2012 21:11, Wolfgang Denk <wd@denx.de> wrote:

> Dear Amar,
>
> In message <1356709972-26549-10-git-send-email-amarendra.xt@samsung.com>
> you wrote:
> > This patch adds commands to open, close and create partitions on EMMC
>
> In which way are partitions on MC devices special, compare to
> partitions on other storage devies?
>
> I mean, does it reeally make sense to create a (E?) MMC specific
> command here, instead of providing general partition support hat can
> also be used on other storage devices?
>
> 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
> "Never face facts; if you do, you'll never get up in the morning."
> - Marlo Thomas
>  _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>
Wolfgang Denk - Jan. 4, 2013, 10:09 a.m.
Dear Amarendra Reddy,

In message <CAPbRUm=2t8=mOJZEWV98eQ15nV8Rqo0SbJXWM7mzJ+ZFT2qe9A@mail.gmail.com> you wrote:
>
> Thanks for the review comments.
> I would like to clarify that this patch resizes EMMC partitions. But does
> not create partitions.
> I think the statement *"..close and create partitions on EMMC"* was
> misleading, which I corrected in latest patch set.
> 
> The EMMC4.4 chips are provided with 2 boot partitons and 1 RPMB partition.
> This patch merely deals with resizing Boot partitions & RPMB partition, by
> sending proper commands to EMMC chip.

I see, but I still think that instead of adding (E)MMC specific
partition handling, we should instead start and add a generc command
to create/change/delete partitions, and then provide the (E)MMC
specific implementation for it.  This way we can later add partition
handling for other storage media if someone needs this.  Otherwise we
would have a growing number of completely separate implementations,
with incomplatible user interfaces and all the other maintenance
nightmares this would cause.

That means the core of your implementation will remain the same, just
the command interface should be made generic so it can be extended to
add support for other storage devices.

Best regards,

Wolfgang Denk

Patch

diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c
index 62a1c22..355ab8e 100644
--- a/common/cmd_mmc.c
+++ b/common/cmd_mmc.c
@@ -248,6 +248,85 @@  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;
+
+		if (argc == 2)
+			dev = curr_device;
+		else if (argc == 3)
+			dev = simple_strtoul(argv[2], 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 (strcmp(argv[1], "open") == 0) {
+			if (!(mmc_boot_open(mmc))) {
+				printf("EMMC OPEN Success.\n");
+				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 boot"
+					" partition, Before, all"
+					" images are written.\n");
+				return 0;
+			} else {
+				printf("EMMC OPEN Failed.\n");
+				return 1;
+			}
+		}
+
+		if (strcmp(argv[1], "close") == 0) {
+			if (!(mmc_boot_close(mmc))) {
+				printf("EMMC CLOSE Success.\n");
+				return 0;
+			} else {
+				printf("EMMC CLOSE Failed.\n");
+				return 1;
+			}
+		}
+	} else if (strcmp(argv[1], "bootpart") == 0) {
+		int dev;
+		dev = simple_strtoul(argv[2], NULL, 10);
+
+		struct mmc *mmc = find_mmc_device(dev);
+		u32 bootsize = simple_strtoul(argv[3], NULL, 10);
+		u32 rpmbsize = simple_strtoul(argv[4], NULL, 10);
+
+		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;
+		}
 	}
 
 	if (strcmp(argv[1], "read") == 0)
@@ -318,5 +397,9 @@  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 <device num> - opens the specified device\n"
+	"mmc close <device num> - closes the specified device\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