On 1/18/22 06:54, Marek Vasut wrote: > 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: Marek Vasut <ma...@denx.de> > Cc: Fabio Estevam <feste...@gmail.com> > Cc: Jaehoon Chung <jh80.ch...@samsung.com> > Cc: Peng Fan <peng....@nxp.com> > Cc: Stefano Babic <sba...@denx.de>
Reviewed-by: Jaehoon Chung <jh80.ch...@samsung.com> Best Regards, Jaehoon Chung > --- > cmd/mmc.c | 22 ++++++++++++++++++++-- > 1 file changed, 20 insertions(+), 2 deletions(-) > > diff --git a/cmd/mmc.c b/cmd/mmc.c > index 96d81ffdf36..503dbb6199c 100644 > --- a/cmd/mmc.c > +++ b/cmd/mmc.c > @@ -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); > }