diff mbox series

mmc: core: crypto: Add MMC_CAP2_CRYPTO_RETAIN_KEY

Message ID 20230821065037.1146977-1-quic_omprsing@quicinc.com (mailing list archive)
State New, archived
Headers show
Series mmc: core: crypto: Add MMC_CAP2_CRYPTO_RETAIN_KEY | expand

Commit Message

Om Prakash Singh Aug. 21, 2023, 6:50 a.m. UTC
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(-)

Comments

Eric Biggers Aug. 22, 2023, 4:50 a.m. UTC | #1
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
Om Prakash Singh Aug. 23, 2023, 3:56 a.m. UTC | #2
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 mbox series

Patch

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 */