Message ID | 20230821065037.1146977-1-quic_omprsing@quicinc.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | mmc: core: crypto: Add MMC_CAP2_CRYPTO_RETAIN_KEY | expand |
On Mon, Aug 21, 2023 at 12:20:37PM +0530, Om Prakash Singh wrote: > 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. MMC_CAP2_RETAINS_CRYPTO_KEYS would be a better name. > 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; > } Are you sure that *all* versions of Qualcomm's eMMC inline encryption hardware have this behavior? > 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 */ How about: /* Host retains inline encryption keys on reset */ > #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 */ '1 << 28' is already used. Also, the new flag doesn't need to be in the #ifdef section. - Eric
On 8/22/2023 10:20 AM, Eric Biggers wrote: > On Mon, Aug 21, 2023 at 12:20:37PM +0530, Om Prakash Singh wrote: >> 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. > > MMC_CAP2_RETAINS_CRYPTO_KEYS would be a better name. I will update in next version > >> 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; >> } > > Are you sure that *all* versions of Qualcomm's eMMC inline encryption hardware > have this behavior? Thanks for pointing this out. I am not sure and checking internally for more information. > >> 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 */ > > How about: > > /* Host retains inline encryption keys on reset */ > I will update in next version >> #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 */ > > '1 << 28' is already used. ack > Also, the new flag doesn't need to be in the #ifdef section. > > - Eric
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 */
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@quicinc.com> --- 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(-)