
From: Markus Niebel Markus.Niebel@ew.tq-group.com
This helper will be used later on in an extension of the mmc command.
Signed-off-by: Markus Niebel Markus.Niebel@ew.tq-group.com Signed-off-by: Matthias Schiffer matthias.schiffer@ew.tq-group.com --- drivers/mmc/mmc.c | 38 ++++++++++++++++++++++++++++++++++++++ include/mmc.h | 1 + 2 files changed, 39 insertions(+)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index d3babbfeb1c..c1b1ef7eb0b 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -1039,6 +1039,44 @@ int mmc_switch_part(struct mmc *mmc, unsigned int part_num) }
#if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING) +int mmc_max_enhanced_size_sectors(struct mmc *mmc, u64 *size) +{ + u64 sz; + int err; + + ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN); + + if (IS_SD(mmc) || mmc->version < MMC_VERSION_4_41) { + pr_err("eMMC >= 4.4 required for enhanced user data area\n"); + return -EMEDIUMTYPE; + } + + if (!(mmc->part_support & PART_SUPPORT)) { + pr_err("Card does not support partitioning\n"); + return -EMEDIUMTYPE; + } + + if (!mmc->hc_wp_grp_size) { + pr_err("Card does not define HC WP group size\n"); + return -EMEDIUMTYPE; + } + + err = mmc_send_ext_csd(mmc, ext_csd); + if (err) + return err; + + sz = + (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]; + sz *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]; + sz *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; + sz *= SZ_1K; + *size = sz; + + return 0; +} + int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf, enum mmc_hwpart_conf_mode mode) diff --git a/include/mmc.h b/include/mmc.h index b92e2553402..3e1fc82d9b4 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -846,6 +846,7 @@ void print_mmc_devices(char separator); */ int get_mmc_num(void); int mmc_switch_part(struct mmc *mmc, unsigned int part_num); +int mmc_max_enhanced_size_sectors(struct mmc *mmc, u64 *size); int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf, enum mmc_hwpart_conf_mode mode);