Message ID | 20240708235330.103590-4-ebiggers@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | Basic inline encryption support for ufs-exynos | expand |
> -----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 --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,