diff mbox series

[v3,3/6] scsi: ufs: core: Add UFSHCD_QUIRK_BROKEN_CRYPTO_ENABLE

Message ID 20240708235330.103590-4-ebiggers@kernel.org (mailing list archive)
State Accepted
Commit e95881e0081a30e132b5ca087f1e07fc08608a7e
Headers show
Series Basic inline encryption support for ufs-exynos | expand

Commit Message

Eric Biggers July 8, 2024, 11:53 p.m. UTC
From: Eric Biggers <ebiggers@google.com>

Add UFSHCD_QUIRK_BROKEN_CRYPTO_ENABLE which tells the UFS core to not
use the crypto enable bit defined by the UFS specification.  This is
needed to support inline encryption on the "Exynos" UFS controller.

Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Peter Griffin <peter.griffin@linaro.org>
Signed-off-by: Eric Biggers <ebiggers@google.com>
---
 drivers/ufs/core/ufshcd-crypto.c | 8 ++++++++
 include/ufs/ufshcd.h             | 7 +++++++
 2 files changed, 15 insertions(+)

Comments

Alim Akhtar July 10, 2024, 7:42 a.m. UTC | #1
> -----Original Message-----
> From: Eric Biggers <ebiggers@kernel.org>
> Sent: Tuesday, July 9, 2024 5:23 AM
> To: linux-scsi@vger.kernel.org
> Cc: linux-samsung-soc@vger.kernel.org; linux-fscrypt@vger.kernel.org; Alim
> Akhtar <alim.akhtar@samsung.com>; Avri Altman <avri.altman@wdc.com>;
> Bart Van Assche <bvanassche@acm.org>; Martin K . Petersen
> <martin.petersen@oracle.com>; Peter Griffin <peter.griffin@linaro.org>;
> André Draszik <andre.draszik@linaro.org>; William McVicker
> <willmcvicker@google.com>
> Subject: [PATCH v3 3/6] scsi: ufs: core: Add
> UFSHCD_QUIRK_BROKEN_CRYPTO_ENABLE
> 
> From: Eric Biggers <ebiggers@google.com>
> 
> Add UFSHCD_QUIRK_BROKEN_CRYPTO_ENABLE which tells the UFS core to
> not use the crypto enable bit defined by the UFS specification.  This is
> needed to support inline encryption on the "Exynos" UFS controller.
> 
> Reviewed-by: Bart Van Assche <bvanassche@acm.org>
> Reviewed-by: Peter Griffin <peter.griffin@linaro.org>
> Signed-off-by: Eric Biggers <ebiggers@google.com>
> ---
Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>

>  drivers/ufs/core/ufshcd-crypto.c | 8 ++++++++
>  include/ufs/ufshcd.h             | 7 +++++++
>  2 files changed, 15 insertions(+)
> 
> diff --git a/drivers/ufs/core/ufshcd-crypto.c b/drivers/ufs/core/ufshcd-
> crypto.c
> index b4980fd91cee..a714dad82cd1 100644
> --- a/drivers/ufs/core/ufshcd-crypto.c
> +++ b/drivers/ufs/core/ufshcd-crypto.c
> @@ -108,17 +108,25 @@ static int ufshcd_crypto_keyslot_evict(struct
> blk_crypto_profile *profile,
>  	union ufs_crypto_cfg_entry cfg = {};
> 
>  	return ufshcd_program_key(hba, &cfg, slot);  }
> 
> +/*
> + * Reprogram the keyslots if needed, and return true if
> +CRYPTO_GENERAL_ENABLE
> + * should be used in the host controller initialization sequence.
> + */
>  bool ufshcd_crypto_enable(struct ufs_hba *hba)  {
>  	if (!(hba->caps & UFSHCD_CAP_CRYPTO))
>  		return false;
> 
>  	/* Reset might clear all keys, so reprogram all the keys. */
>  	blk_crypto_reprogram_all_keys(&hba->crypto_profile);
> +
> +	if (hba->quirks & UFSHCD_QUIRK_BROKEN_CRYPTO_ENABLE)
> +		return false;
> +
>  	return true;
>  }
> 
>  static const struct blk_crypto_ll_ops ufshcd_crypto_ops = {
>  	.keyslot_program	= ufshcd_crypto_keyslot_program,
> diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h index
> b354a7eee478..4b7ad23a4420 100644
> --- a/include/ufs/ufshcd.h
> +++ b/include/ufs/ufshcd.h
> @@ -650,10 +650,17 @@ enum ufshcd_quirks {
>  	 * nonstandard way and/or needs to override blk_crypto_ll_ops.  If
>  	 * enabled, the standard code won't initialize the blk_crypto_profile;
>  	 * ufs_hba_variant_ops::init() must do it instead.
>  	 */
>  	UFSHCD_QUIRK_CUSTOM_CRYPTO_PROFILE		= 1 << 22,
> +
> +	/*
> +	 * This quirk needs to be enabled if the host controller supports inline
> +	 * encryption but does not support the CRYPTO_GENERAL_ENABLE
> bit, i.e.
> +	 * host controller initialization fails if that bit is set.
> +	 */
> +	UFSHCD_QUIRK_BROKEN_CRYPTO_ENABLE		= 1 << 23,
>  };
> 
>  enum ufshcd_caps {
>  	/* Allow dynamic clk gating */
>  	UFSHCD_CAP_CLK_GATING				= 1 << 0,
> --
> 2.45.2
diff mbox series

Patch

diff --git a/drivers/ufs/core/ufshcd-crypto.c b/drivers/ufs/core/ufshcd-crypto.c
index b4980fd91cee..a714dad82cd1 100644
--- a/drivers/ufs/core/ufshcd-crypto.c
+++ b/drivers/ufs/core/ufshcd-crypto.c
@@ -108,17 +108,25 @@  static int ufshcd_crypto_keyslot_evict(struct blk_crypto_profile *profile,
 	union ufs_crypto_cfg_entry cfg = {};
 
 	return ufshcd_program_key(hba, &cfg, slot);
 }
 
+/*
+ * Reprogram the keyslots if needed, and return true if CRYPTO_GENERAL_ENABLE
+ * should be used in the host controller initialization sequence.
+ */
 bool ufshcd_crypto_enable(struct ufs_hba *hba)
 {
 	if (!(hba->caps & UFSHCD_CAP_CRYPTO))
 		return false;
 
 	/* Reset might clear all keys, so reprogram all the keys. */
 	blk_crypto_reprogram_all_keys(&hba->crypto_profile);
+
+	if (hba->quirks & UFSHCD_QUIRK_BROKEN_CRYPTO_ENABLE)
+		return false;
+
 	return true;
 }
 
 static const struct blk_crypto_ll_ops ufshcd_crypto_ops = {
 	.keyslot_program	= ufshcd_crypto_keyslot_program,
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index b354a7eee478..4b7ad23a4420 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -650,10 +650,17 @@  enum ufshcd_quirks {
 	 * nonstandard way and/or needs to override blk_crypto_ll_ops.  If
 	 * enabled, the standard code won't initialize the blk_crypto_profile;
 	 * ufs_hba_variant_ops::init() must do it instead.
 	 */
 	UFSHCD_QUIRK_CUSTOM_CRYPTO_PROFILE		= 1 << 22,
+
+	/*
+	 * This quirk needs to be enabled if the host controller supports inline
+	 * encryption but does not support the CRYPTO_GENERAL_ENABLE bit, i.e.
+	 * host controller initialization fails if that bit is set.
+	 */
+	UFSHCD_QUIRK_BROKEN_CRYPTO_ENABLE		= 1 << 23,
 };
 
 enum ufshcd_caps {
 	/* Allow dynamic clk gating */
 	UFSHCD_CAP_CLK_GATING				= 1 << 0,