[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