]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
mmc: allow use of hardware partition names for mmc partconf
authorTim Harvey <tharvey@gateworks.com>
Fri, 31 May 2024 15:36:34 +0000 (08:36 -0700)
committerTom Rini <trini@konsulko.com>
Thu, 5 Sep 2024 18:12:51 +0000 (12:12 -0600)
eMMC v4+ devices have hardware partitions that are accessed via the
PARTITION_CONFIG (Extended CSD Register 179) PARTITION_ACCESS
and BOOT_PARTITION_ENABLE fields defined as:
bit 5:3: BOOT_PARTITION_ENABLE
  0x0: Device not boot enabled (default)
  0x1: Boot Area partition 1 enabled for boot
  0x2: Boot Area partition 2 enabled for boot
  0x3-0x6: Reserved
  0x7: User area enabled for boot
bit 2:0 PARTITION_ACCESS
  0x0: No access to boot partition (default)
  0x1: Boot Area partition 1
  0x2: Boot Area partition 2
  0x3: Replay Protected Memory Block (RPMB)
  0x4: Access to General Purpose partition 1
  0x5: Access to General Purpose partition 2
  0x6: Access to General Purpose partition 3
  0x7: Access to General Purpose partition 4

Add char arrays to provide names for these values.

Use these names which displaying or setting the PARTITION_CONFIG
register via the 'mmc partconf' command.

Before:
u-boot=> mmc partconf 2 1 1 0 && mmc partconf 2
EXT_CSD[179], PARTITION_CONFIG:
BOOT_ACK: 0x1
BOOT_PARTITION_ENABLE: 0x2
PARTITION_ACCESS: 0x0

After:
u-boot=> mmc partconf 2 1 1 0 && mmc partconf 2
EXT_CSD[179], PARTITION_CONFIG:
BOOT_ACK: 0x1
BOOT_PARTITION_ENABLE: 0x1 (boot0)
PARTITION_ACCESS: 0x0 (user)
u-boot=> mmc partconf 2 1 boot1 0 && mmc partconf 2
EXT_CSD[179], PARTITION_CONFIG:
BOOT_ACK: 0x1
BOOT_PARTITION_ENABLE: 0x2 (boot1)
PARTITION_ACCESS: 0x0 (user)

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
cmd/mmc.c
drivers/mmc/mmc.c
include/mmc.h

index 2d5430a53079628b8bb10ba49a1ff46bcb4bd837..02316796ba4e0f9260b5673b5fbe9ddf61f3e058 100644 (file)
--- a/cmd/mmc.c
+++ b/cmd/mmc.c
@@ -14,6 +14,7 @@
 #include <part.h>
 #include <sparse_format.h>
 #include <image-sparse.h>
+#include <linux/ctype.h>
 
 static int curr_device = -1;
 
@@ -918,8 +919,9 @@ static int mmc_partconf_print(struct mmc *mmc, const char *varname)
 
        printf("EXT_CSD[179], PARTITION_CONFIG:\n"
                "BOOT_ACK: 0x%x\n"
-               "BOOT_PARTITION_ENABLE: 0x%x\n"
-               "PARTITION_ACCESS: 0x%x\n", ack, part, access);
+               "BOOT_PARTITION_ENABLE: 0x%x (%s)\n"
+               "PARTITION_ACCESS: 0x%x (%s)\n", ack, part, emmc_boot_part_names[part],
+               access, emmc_hwpart_names[access]);
 
        return CMD_RET_SUCCESS;
 }
@@ -948,9 +950,26 @@ static int do_mmc_partconf(struct cmd_tbl *cmdtp, int flag,
        if (argc == 2 || argc == 3)
                return mmc_partconf_print(mmc, cmd_arg2(argc, argv));
 
+       /* BOOT_ACK */
        ack = dectoul(argv[2], NULL);
-       part_num = dectoul(argv[3], NULL);
-       access = dectoul(argv[4], NULL);
+       /* BOOT_PARTITION_ENABLE */
+       if (!isdigit(*argv[3])) {
+               for (part_num = ARRAY_SIZE(emmc_boot_part_names) - 1; part_num > 0; part_num--) {
+                       if (!strcmp(argv[3], emmc_boot_part_names[part_num]))
+                               break;
+               }
+       } else {
+               part_num = dectoul(argv[3], NULL);
+       }
+       /* PARTITION_ACCESS */
+       if (!isdigit(*argv[4])) {
+               for (access = ARRAY_SIZE(emmc_hwpart_names) - 1; access > 0; access--) {
+                       if (!strcmp(argv[4], emmc_hwpart_names[access]))
+                               break;
+               }
+       } else {
+               access = dectoul(argv[4], NULL);
+       }
 
        /* acknowledge to be sent during boot operation */
        ret = mmc_set_part_conf(mmc, ack, part_num, access);
index 7b068c71ff37871c309729faa573629b73635898..bfbf47a7300946e9ad9c6da7fc861dd84f328c6e 100644 (file)
 
 #define DEFAULT_CMD6_TIMEOUT_MS  500
 
+/**
+ * names of emmc BOOT_PARTITION_ENABLE values
+ *
+ * Boot Area Partitions - name consistent with Linux
+ */
+const char *emmc_boot_part_names[] = {
+       "default",      /* EMMC_BOOT_PART_DEFAULT */
+       "boot0",        /* EMMC_BOOT_PART_BOOT1 */
+       "boot1",        /* EMMC_BOOT_PART_BOOT2 */
+       "",
+       "",
+       "",
+       "",
+       "user",         /* EMMC_BOOT_PART_USER */
+};
+
+/**
+ * names of emmc 'hardware partitions' consistent with:
+ *  - value used in mmc_switch()
+ *  - value used by PARTITION_CONFIG PARTITION_ACCESS field
+ *
+ * Boot Area Partitions - name consistent with Linux
+ * General Perpose Partitions - name consistent with 'mmc hwpartition' usage
+ */
+const char *emmc_hwpart_names[] = {
+       "user",         /* EMMC_HWPART_DEFAULT */
+       "boot0",        /* EMMC_HWPART_BOOT1 */
+       "boot1",        /* EMMC_HWPART_BOOT2 */
+       "rpmb",         /* EMMC_HWPART_RPMB */
+       "gp1",          /* EMMC_HWPART_GP1 */
+       "gp2",          /* EMMC_HWPART_GP2 */
+       "gp3",          /* EMMC_HWPART_GP3 */
+       "gp4",          /* EMMC_HWPART_GP4 */
+};
+
 static int mmc_set_signal_voltage(struct mmc *mmc, uint signal_voltage);
 
 #if !CONFIG_IS_ENABLED(DM_MMC)
index 0f3f1ed6aaa352c69e32cf5e9fab11b6014356d8..2e2f5dd12b8b48321f9636678447efe1c5d0f7c8 100644 (file)
@@ -389,6 +389,9 @@ enum emmc_boot_part {
        EMMC_BOOT_PART_USER = 7,
 };
 
+/* emmc PARTITION_CONFIG BOOT_PARTITION_ENABLE names */
+extern const char *emmc_boot_part_names[8];
+
 /* emmc PARTITION_CONFIG ACCESS_ENABLE values */
 enum emmc_hwpart {
        EMMC_HWPART_DEFAULT = 0, /* user */
@@ -401,6 +404,9 @@ enum emmc_hwpart {
        EMMC_HWPART_GP4 = 7,
 };
 
+/* emmc PARTITION_CONFIG ACCESS_ENABLE names */
+extern const char *emmc_hwpart_names[8];
+
 /* Driver model support */
 
 /**