]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
mmc: use an enumerated type to represent PARTITION_CONFIG fields
authorTim Harvey <tharvey@gateworks.com>
Fri, 31 May 2024 15:36:33 +0000 (08:36 -0700)
committerTom Rini <trini@konsulko.com>
Thu, 5 Sep 2024 18:12:51 +0000 (12:12 -0600)
Modern eMMC v4+ devices have multiple hardware partitions per the JEDEC
specification described as:
  Boot Area Partition 1
  Boot Area Partition 2
  RPMB Partition
  General Purpose Partition 1
  General Purpose Partition 2
  General Purpose Partition 3
  General Purpose Partition 4
  User Data Area

These are referenced by fields in the PARTITION_CONFIG register
(Extended CSD Register 179) which is defined as:
bit 7: reserved
bit 6: BOOT_ACK
  0x0: No boot acknowledge sent (default
  0x1: Boot acknowledge sent during boot operation Bit
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

Note that setting PARTITION_ACCESS to 0x0 results in selecting the User
Data Area partition.

You can see above that the two fields BOOT_PARTITION_ENABLE and
PARTITION_ACCESS do not use the same enumerated values.

U-Boot uses a set of macros to access fields of the PARTITION_CONFIG
register:

There are various places in U-Boot where the BOOT_PARTITION_ENABLE field
is accessed via EXT_CSD_EXTRACT_PARTITION_ACCESS and converted to a
hardware partition consistent with the definition of the
PARTITION_ACCESS field which is also the value used to specify the
hardware partition of the various mmc_switch incarnations.

To add some sanity to the distinction between BOOT_PARTITION_ENABLE
(used to specify the active device on power-cycle) and PARTITION_ACCESS
(used to switch between hardware partitions) create two enumerated types
and use them wherever struct mmc * part_config is used or the above
macros are used.

This represents no code changes.

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
arch/arm/mach-imx/image-container.c
arch/arm/mach-sunxi/board.c
board/gateworks/venice/spl.c
board/gateworks/venice/venice.c
board/purism/librem5/librem5.c
board/storopack/smegw01/smegw01.c
cmd/mvebu/bubt.c
common/spl/spl_mmc.c
include/mmc.h

index 35da0ae04258dbd31ed8778c9a2a80087078af21..bcd40889f0fac0d2247961715641bf281863031b 100644 (file)
@@ -205,7 +205,7 @@ static unsigned long get_boot_device_offset(void *dev, int dev_type)
                } else {
                        u8 part = EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config);
 
-                       if (part == 1 || part == 2) {
+                       if (part == EMMC_BOOT_PART_BOOT1 || part == EMMC_BOOT_PART_BOOT2) {
                                if (is_imx8qxp() && is_soc_rev(CHIP_REV_B))
                                        offset = CONTAINER_HDR_MMCSD_OFFSET;
                                else
@@ -294,15 +294,15 @@ int spl_mmc_emmc_boot_partition(struct mmc *mmc)
        int part;
 
        part = EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config);
-       if (part == 1 || part == 2) {
+       if (part == EMMC_BOOT_PART_BOOT1 || part == EMMC_BOOT_PART_BOOT2) {
                unsigned long sec_set_off = 0;
                bool sec_boot = false;
 
                sec_boot = check_secondary_cnt_set(&sec_set_off);
                if (sec_boot)
-                       part = (part == 1) ? 2 : 1;
-       } else if (part == 7) {
-               part = 0;
+                       part = (part == EMMC_BOOT_PART_BOOT1) ? EMMC_HWPART_BOOT2 : EMMC_HWPART_BOOT1;
+       } else if (part == EMMC_BOOT_PART_USER) {
+               part = EMMC_HWPART_DEFAULT;
        }
 
        return part;
index 0140b07d32a63dfbabe1b85cc52789a0322e3dac..860e7058b69c80fe9d368b90ca8cd948c2bf71c1 100644 (file)
@@ -396,7 +396,7 @@ static bool sunxi_valid_emmc_boot(struct mmc *mmc)
                return false;
 
        /* Partition 0 is the user data partition, bootpart must be 1 or 2. */
-       if (bootpart != 1 && bootpart != 2)
+       if (bootpart != EMMC_BOOT_PART_BOOT1 && bootpart != EMMC_BOOT_PART_BOOT2)
                return false;
 
        /* Failure to switch to the boot partition is fatal. */
index b0a315ba9531f1779d774008da0e017066918797..05911ce9dd97db2b2b857d6257a5698e71fa42d2 100644 (file)
@@ -350,8 +350,8 @@ unsigned long board_spl_mmc_get_uboot_raw_sector(struct mmc *mmc, unsigned long
 {
        if (!IS_SD(mmc)) {
                switch (EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config)) {
-               case 1:
-               case 2:
+               case EMMC_BOOT_PART_BOOT1:
+               case EMMC_BOOT_PART_BOOT2:
                        if (IS_ENABLED(CONFIG_IMX8MN) || IS_ENABLED(CONFIG_IMX8MP))
                                raw_sect -= 32 * 2;
                        break;
index 5b105d7659e402e5705a3c94423c7d892f465101..44ed4e4598e107f9736e7d5a90b39a5767a51374 100644 (file)
@@ -173,20 +173,20 @@ int board_late_init(void)
                        int bootpart;
 
                        switch (EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config)) {
-                       case 1: /* boot0 */
-                               bootpart = 1;
+                       case EMMC_BOOT_PART_BOOT1:
+                               bootpart = EMMC_HWPART_BOOT1;
                                break;
-                       case 2: /* boot1 */
-                               bootpart = 2;
+                       case EMMC_BOOT_PART_BOOT2:
+                               bootpart = EMMC_HWPART_BOOT2;
                                break;
-                       case 7: /* user */
+                       case EMMC_BOOT_PART_USER:
                        default:
-                               bootpart = 0;
+                               bootpart = EMMC_HWPART_DEFAULT;
                                break;
                        }
                        /* IMX8MP/IMX8MN BOOTROM v2 uses offset=0 for boot parts */
                        if ((IS_ENABLED(CONFIG_IMX8MN) || IS_ENABLED(CONFIG_IMX8MP)) &&
-                           (bootpart == 1 || bootpart == 2))
+                           (bootpart == EMMC_BOOT_PART_BOOT1 || bootpart == EMMC_BOOT_PART_BOOT2))
                                bootblk = 0;
                        env_set_hex("bootpart", bootpart);
                        env_set_hex("bootblk", bootblk);
@@ -217,10 +217,10 @@ uint mmc_get_env_part(struct mmc *mmc)
 {
        if (!IS_SD(mmc)) {
                switch (EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config)) {
-               case 1:
-                       return 1;
-               case 2:
-                       return 2;
+               case EMMC_BOOT_PART_BOOT1:
+                       return EMMC_HWPART_BOOT1;
+               case EMMC_BOOT_PART_BOOT2:
+                       return EMMC_HWPART_BOOT2;
                }
        }
 
index d0249e71f09aa1a84a6109f24aa558e2d39fbfde..3f1a8e385d7245af95e8db86ed233a320fc267e4 100644 (file)
@@ -43,8 +43,8 @@ uint board_mmc_get_env_part(struct mmc *mmc)
 {
        uint part = EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config);
 
-       if (part == 7)
-               part = 0;
+       if (part == EMMC_BOOT_PART_USER)
+               part = EMMC_HWPART_DEFAULT;
        return part;
 }
 #endif
index 345191b31c29b521d3786e54f3822211c2ca6029..d1f474bc7a14cd8d4b9e695d13a92cd75298cd0d 100644 (file)
@@ -106,8 +106,8 @@ uint mmc_get_env_part(struct mmc *mmc)
 {
        uint part = EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config);
 
-       if (part == 7)
-               part = 0;
+       if (part == EMMC_BOOT_PART_USER)
+               part = EMMC_HWPART_DEFAULT;
        return part;
 }
 
index 744b1c20aa83f2f4743975dfdd132c40c5ab9c51..1e3f5bf7add6d02ba7b87b83626eff2de679d4ca 100644 (file)
@@ -224,8 +224,8 @@ static int mmc_burn_image(size_t image_size)
 #endif
 
        part = EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config);
-       if (part == 7)
-               part = 0;
+       if (part == EMMC_BOOT_PART_USER)
+               part = EMMC_HWPART_DEFAULT;
 
 #ifdef CONFIG_BLK
        err = blk_dselect_hwpart(blk_desc, part);
index 3d032bb27ce3ff89dff674498eaa48098cf6d9cf..fd5154dad7c4eb6fc9a0221a1f6affda3b0e709f 100644 (file)
@@ -320,8 +320,8 @@ int default_spl_mmc_emmc_boot_partition(struct mmc *mmc)
         * which is the first physical partition (0).
         */
        part = EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config);
-       if (part == 7)
-               part = 0;
+       if (part == EMMC_BOOT_PART_USER)
+               part = EMMC_HWPART_DEFAULT;
 #endif
        return part;
 }
index 4b8327f1f93b6bebdaa1c8e968b46df311afde73..0f3f1ed6aaa352c69e32cf5e9fab11b6014356d8 100644 (file)
@@ -381,6 +381,26 @@ enum mmc_voltage {
 #define MMC_TIMING_MMC_HS200   9
 #define MMC_TIMING_MMC_HS400   10
 
+/* emmc PARTITION_CONFIG BOOT_PARTITION_ENABLE values */
+enum emmc_boot_part {
+       EMMC_BOOT_PART_DEFAULT = 0,
+       EMMC_BOOT_PART_BOOT1 = 1,
+       EMMC_BOOT_PART_BOOT2 = 2,
+       EMMC_BOOT_PART_USER = 7,
+};
+
+/* emmc PARTITION_CONFIG ACCESS_ENABLE values */
+enum emmc_hwpart {
+       EMMC_HWPART_DEFAULT = 0, /* user */
+       EMMC_HWPART_BOOT1 = 1,
+       EMMC_HWPART_BOOT2 = 2,
+       EMMC_HWPART_RPMB = 3,
+       EMMC_HWPART_GP1 = 4,
+       EMMC_HWPART_GP2 = 5,
+       EMMC_HWPART_GP3 = 6,
+       EMMC_HWPART_GP4 = 7,
+};
+
 /* Driver model support */
 
 /**