Skip to content
Snippets Groups Projects
Commit 1d4b3b2f authored by Marek Vasut's avatar Marek Vasut Committed by Jaehoon Chung
Browse files

cmd: mmc: Consider GP partitions in mmc hwpartition user enh start -


In case the eMMC contains any GP partitions or user sets up new GP
partitions, the size of these GP partitions reduce the size of the
USER partition. Subtract the size of those GP partitions from the
calculated size of USER partition when using `user enh start -`.

The following test used to fail before:
```
u-boot=> mmc hwpartition gp1 524288 enh user enh 0 - wrrel on check
Partition configuration:
        User Enhanced Start: 0 Bytes
        User Enhanced Size: 1.8 GiB
        User partition write reliability: on
        GP1 Capacity: 256 MiB ENH
        No GP2 partition
        No GP3 partition
        No GP4 partition
Total enhanced size exceeds maximum (261 > 229)
Failed!
```
The test now passes:
```
u-boot=> mmc hwpartition gp1 524288 enh user enh 0 - wrrel on check
Partition configuration:
        User Enhanced Start: 0 Bytes
        User Enhanced Size: 1.5 GiB
        User partition write reliability: on
        GP1 Capacity: 256 MiB ENH
        No GP2 partition
        No GP3 partition
        No GP4 partition
```

Signed-off-by: default avatarMarek Vasut <marex@denx.de>
Cc: Fabio Estevam <festevam@gmail.com>
Cc: Jaehoon Chung <jh80.chung@samsung.com>
Cc: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
Reviewed-by: default avatarFabio Estevam <festevam@gmail.com>
Reviewed-by: default avatarJaehoon Chung <jh80.chung@samsung.com>
parent 531c0089
No related branches found
No related tags found
No related merge requests found
......@@ -597,7 +597,7 @@ static void parse_hwpart_user_enh_size(struct mmc *mmc,
struct mmc_hwpart_conf *pconf,
char *argv)
{
int ret;
int i, ret;
pconf->user.enh_size = 0;
......@@ -606,7 +606,7 @@ static void parse_hwpart_user_enh_size(struct mmc *mmc,
ret = mmc_send_ext_csd(mmc, ext_csd);
if (ret)
return;
/* This value is in 512B block units */
/* The enh_size value is in 512B block units */
pconf->user.enh_size =
((ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT + 2] << 16) +
(ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT + 1] << 8) +
......@@ -614,6 +614,24 @@ static void parse_hwpart_user_enh_size(struct mmc *mmc,
ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] *
ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
pconf->user.enh_size -= pconf->user.enh_start;
for (i = 0; i < ARRAY_SIZE(mmc->capacity_gp); i++) {
/*
* If the eMMC already has GP partitions set,
* subtract their size from the maximum USER
* partition size.
*
* Else, if the command was used to configure new
* GP partitions, subtract their size from maximum
* USER partition size.
*/
if (mmc->capacity_gp[i]) {
/* The capacity_gp is in 1B units */
pconf->user.enh_size -= mmc->capacity_gp[i] >> 9;
} else if (pconf->gp_part[i].size) {
/* The gp_part[].size is in 512B units */
pconf->user.enh_size -= pconf->gp_part[i].size;
}
}
} else {
pconf->user.enh_size = dectoul(argv, NULL);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment