> -----Original Message----- > From: Eric Biggers <ebiggers@xxxxxxxxxx> > Sent: Tuesday, July 9, 2024 5:23 AM > To: linux-scsi@xxxxxxxxxxxxxxx > Cc: linux-samsung-soc@xxxxxxxxxxxxxxx; linux-fscrypt@xxxxxxxxxxxxxxx; Alim > Akhtar <alim.akhtar@xxxxxxxxxxx>; Avri Altman <avri.altman@xxxxxxx>; > Bart Van Assche <bvanassche@xxxxxxx>; Martin K . Petersen > <martin.petersen@xxxxxxxxxx>; Peter Griffin <peter.griffin@xxxxxxxxxx>; > André Draszik <andre.draszik@xxxxxxxxxx>; William McVicker > <willmcvicker@xxxxxxxxxx> > Subject: [PATCH v3 3/6] scsi: ufs: core: Add > UFSHCD_QUIRK_BROKEN_CRYPTO_ENABLE > > From: Eric Biggers <ebiggers@xxxxxxxxxx> > > 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@xxxxxxx> > Reviewed-by: Peter Griffin <peter.griffin@xxxxxxxxxx> > Signed-off-by: Eric Biggers <ebiggers@xxxxxxxxxx> > --- Reviewed-by: Alim Akhtar <alim.akhtar@xxxxxxxxxxx> > 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