[RFC PATCH 3/5] scsi: ufs: add quirk to disable inline crypto support

Eric Biggers
2020-01-10T06:18:31Z

Add a quirk flag which allows UFS drivers to tell the UFS core that
their crypto support is not working properly, so should not be used
despite the host controller declaring the standard crypto support bit.

There are various situations in which this can be needed:

- When the crypto support requires vendor-specific logic that hasn't
been implemented yet. For example, the standard keyslot programming
procedure doesn't work with ufs-hisi and ufs-qcom.

- When necessary vendor-specific crypto registers haven't been declared
in the device tree for the SoC yet.

- When the crypto hardware declares an unsupported vendor-specific
version number, has vendor-specific fuses blown which make it unusable
in the normal way, or a vendor-specific self-test fails.

- The crypto produces the wrong results.

Originally-from: John Stultz <john.stultz@linaro.org>
Signed-off-by: Eric Biggers <ebiggers@google.com>
---
drivers/scsi/ufs/ufshcd-crypto.c | 3 ++-
drivers/scsi/ufs/ufshcd.h | 7 +++++++
2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/ufs/ufshcd-crypto.c b/drivers/scsi/ufs/ufshcd-crypto.c
index 749c325686a7d..2c34beb47f8e0 100644
--- a/drivers/scsi/ufs/ufshcd-crypto.c
+++ b/drivers/scsi/ufs/ufshcd-crypto.c
@@ -278,7 +278,8 @@ int ufshcd_hba_init_crypto(struct ufs_hba *hba)
hba->caps &= ~UFSHCD_CAP_CRYPTO;

/* Return 0 if crypto support isn't present */
- if (!(hba->capabilities & MASK_CRYPTO_SUPPORT))
+ if (!(hba->capabilities & MASK_CRYPTO_SUPPORT) ||
+ (hba->quirks & UFSHCD_QUIRK_BROKEN_CRYPTO))
goto out;

/*
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index 5f5440059dd8a..b6f0d08a98a8b 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -650,6 +650,13 @@ struct ufs_hba {
* enabled via HCE register.
*/
#define UFSHCI_QUIRK_BROKEN_HCE 0x400
+
+ /*
+ * This quirk needs to be enabled if the host controller advertises
+ * inline encryption support but it doesn't work correctly.
+ */
+ #define UFSHCD_QUIRK_BROKEN_CRYPTO 0x800
+
unsigned int quirks; /* Deviations from standard UFSHCI spec. */

/* Device deviations from standard UFS device spec. */
--
2.24.1