diff options
| author | Tom Rini <[email protected]> | 2021-10-29 08:27:32 -0400 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2021-10-29 08:27:32 -0400 |
| commit | a09929cc6c5a108f89e91660f37d745ed119385b (patch) | |
| tree | 9d1b3a9dddc72198f5f823135d60bed7b358faf3 /cmd | |
| parent | aafc378a6caef453a40f2f9f3d6bef69e592c28d (diff) | |
| parent | c95b0297e95613fc68b1d92118ee64720d142f8c (diff) | |
Merge https://source.denx.de/u-boot/custodians/u-boot-mmc
- Fix mmc_switch timeout
- Update mmc hwpartitiion command
- Support wait_dat0 for Freescale eSDHC/sdhci drivers
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/mmc.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/cmd/mmc.c b/cmd/mmc.c index f1e30d0cf64..96d81ffdf36 100644 --- a/cmd/mmc.c +++ b/cmd/mmc.c @@ -593,7 +593,33 @@ 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; + /* This 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) + + ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT]) * 1024 * + 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; @@ -606,8 +632,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) @@ -673,13 +698,18 @@ static int do_mmc_hwpartition(struct cmd_tbl *cmdtp, int flag, if (!mmc) return CMD_RET_FAILURE; + if (IS_SD(mmc)) { + puts("SD doesn't support partitioning\n"); + return CMD_RET_FAILURE; + } + if (argc < 1) return CMD_RET_USAGE; i = 1; 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; |
