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);
>       }

Reply via email to