]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: ufs: core: Add UFSHCD_QUIRK_BROKEN_CRYPTO_ENABLE
authorEric Biggers <ebiggers@google.com>
Mon, 8 Jul 2024 23:53:27 +0000 (16:53 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 11 Jul 2024 02:32:30 +0000 (22:32 -0400)
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>
Link: https://lore.kernel.org/r/20240708235330.103590-4-ebiggers@kernel.org
Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd-crypto.c
include/ufs/ufshcd.h

index b4980fd91cee7060f02da1f7398df924b48a6e37..a714dad82cd1feff4984c25ed408de4b6946f187 100644 (file)
@@ -110,6 +110,10 @@ static int ufshcd_crypto_keyslot_evict(struct blk_crypto_profile *profile,
        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))
@@ -117,6 +121,10 @@ bool ufshcd_crypto_enable(struct ufs_hba *hba)
 
        /* 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;
 }
 
index 4f8982e52ac40dc05370290ca92aa328b6eb2a58..e07104f355c0c64f6003e3e2fa955a90bd42c1bf 100644 (file)
@@ -654,6 +654,13 @@ enum ufshcd_quirks {
         * 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 {