[PATCH] cmd: mmc: Support mmc hwpartition user enh start -

Peng Fan (OSS) peng.fan at oss.nxp.com
Wed Sep 15 04:30:01 CEST 2021


On 2021/9/12 5:14, Marek Vasut wrote:
> Add option to extend the hardware partition to the maximum size by
> using the '-' dash sign instead of $cnt parameter. This is useful
> in case we want to switch the entire eMMC user area into pSLC mode,
> especially in case the device may be populated with different size
> eMMCs. With this change, we do not have to calculate the number of
> blocks of the user area manually.
> 
> To switch the pSLC mode for user area, use e.g. the following.
> WARNING: This is a one-time irreversible change.
> => mmc hwpartition user enh 0 - wrrel on complete
> 
> Signed-off-by: Marek Vasut <marex at denx.de>
> Cc: Fabio Estevam <festevam at gmail.com>
> Cc: Jaehoon Chung <jh80.chung at samsung.com>
> Cc: Peng Fan <peng.fan at nxp.com>
> Cc: Stefano Babic <sbabic at denx.de>
> ---
>   cmd/mmc.c | 32 ++++++++++++++++++++++++++++----
>   1 file changed, 28 insertions(+), 4 deletions(-)
> 
> diff --git a/cmd/mmc.c b/cmd/mmc.c
> index c67ad762422..b6bb951347d 100644
> --- a/cmd/mmc.c
> +++ b/cmd/mmc.c
> @@ -560,7 +560,32 @@ static int do_mmc_list(struct cmd_tbl *cmdtp, int flag,
>   }
>   
>   #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
> -static int parse_hwpart_user(struct mmc_hwpart_conf *pconf,
> +static void parse_hwpart_user_enh_size(struct mmc *mmc,
> +				       struct mmc_hwpart_conf *pconf,
> +				       char *argv)
> +{
> +	int ret;
> +
> +	pconf->user.enh_size = 0;
> +
> +	if (!strcmp(argv, "-"))	{ /* The rest of eMMC */
> +		ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
> +		ret = mmc_send_ext_csd(mmc, ext_csd);
> +		if (ret)
> +			return;
> +		pconf->user.enh_size =
> +			((ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+2] << 16) +

space before/after "+"

> +			(ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+1] << 8) +

Ditto

> +			ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT]) * 1024 *

Hardcode HC_WP_GRP_SIZE to 1024?
Per spec:

(GP_SIZE_MULT_X_2 * 2^16 + GP_SIZE_MULT_X_1 * 2^8 + GP_SIZE_MULT_X_0 * 
2^0) * HC_WP_GRP_SIZE * HC_ERASE_GRP_SIZE * 512kBytes

Thanks,
Peng.


> +			ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] *
> +			ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
> +		pconf->user.enh_size -= pconf->user.enh_start;
> +	} else {
> +		pconf->user.enh_size = dectoul(argv, NULL);
> +	}
> +}
> +
> +static int parse_hwpart_user(struct mmc *mmc, struct mmc_hwpart_conf *pconf,
>   			     int argc, char *const argv[])
>   {
>   	int i = 0;
> @@ -573,8 +598,7 @@ static int parse_hwpart_user(struct mmc_hwpart_conf *pconf,
>   				return -1;
>   			pconf->user.enh_start =
>   				dectoul(argv[i + 1], NULL);
> -			pconf->user.enh_size =
> -				dectoul(argv[i + 2], NULL);
> +			parse_hwpart_user_enh_size(mmc, pconf, argv[i + 2]);
>   			i += 3;
>   		} else if (!strcmp(argv[i], "wrrel")) {
>   			if (i + 1 >= argc)
> @@ -646,7 +670,7 @@ static int do_mmc_hwpartition(struct cmd_tbl *cmdtp, int flag,
>   	while (i < argc) {
>   		if (!strcmp(argv[i], "user")) {
>   			i++;
> -			r = parse_hwpart_user(&pconf, argc-i, &argv[i]);
> +			r = parse_hwpart_user(mmc, &pconf, argc-i, &argv[i]);
>   			if (r < 0)
>   				return CMD_RET_USAGE;
>   			i += r;
> 


More information about the U-Boot mailing list