Add new capability MMC_CAP2_CRYPTO_RETAIN_KEY for mmc host that support inline crypto key retention and doesn't need reinitialization of all keys after mmc host has reinitialized. Signed-off-by: Om Prakash Singh <quic_omprsing@xxxxxxxxxxx> --- drivers/mmc/core/crypto.c | 3 ++- drivers/mmc/host/sdhci-msm.c | 1 + include/linux/mmc/host.h | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/core/crypto.c b/drivers/mmc/core/crypto.c index fec4fbf16a5b..f8ce7c2295f6 100644 --- a/drivers/mmc/core/crypto.c +++ b/drivers/mmc/core/crypto.c @@ -15,7 +15,8 @@ void mmc_crypto_set_initial_state(struct mmc_host *host) { /* Reset might clear all keys, so reprogram all the keys. */ - if (host->caps2 & MMC_CAP2_CRYPTO) + if ((host->caps2 & MMC_CAP2_CRYPTO) && + !(host->caps2 & MMC_CAP2_CRYPTO_RETAIN_KEY)) blk_crypto_reprogram_all_keys(&host->crypto_profile); } diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 1c935b5bafe1..cfc2328f90ed 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -1828,6 +1828,7 @@ static int sdhci_msm_ice_init(struct sdhci_msm_host *msm_host, msm_host->ice = ice; mmc->caps2 |= MMC_CAP2_CRYPTO; + mmc->caps2 |= MMC_CAP2_CRYPTO_RETAIN_KEY; return 0; } diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 461d1543893b..74c69415746d 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -417,8 +417,10 @@ struct mmc_host { #define MMC_CAP2_MERGE_CAPABLE (1 << 26) /* Host can merge a segment over the segment size */ #ifdef CONFIG_MMC_CRYPTO #define MMC_CAP2_CRYPTO (1 << 27) /* Host supports inline encryption */ +#define MMC_CAP2_CRYPTO_RETAIN_KEY (1 << 28) /* Host doesn't need inline encryption key reinitialization */ #else #define MMC_CAP2_CRYPTO 0 +#define MMC_CAP2_CRYPTO_RETAIN_KEY 0 #endif #define MMC_CAP2_ALT_GPT_TEGRA (1 << 28) /* Host with eMMC that has GPT entry at a non-standard location */ -- 2.25.1