scsi: firmware: qcom_scm: Add support for programming inline crypto keys
Add support for the Inline Crypto Engine (ICE) key programming interface that's needed for the ufs-qcom driver to use inline encryption on Snapdragon SoCs. This interface consists of two SCM calls: one to program a key into a keyslot, and one to invalidate a keyslot. Although the UFS specification defines a standard way to do this, on these SoCs the Linux kernel isn't permitted to access the needed crypto configuration registers directly; these SCM calls must be used instead. Link: https://lore.kernel.org/r/20200710072013.177481-2-ebiggers@kernel.org Acked-by: Bjorn Andersson <bjorn.andersson@linaro.org> Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:

committed by
Martin K. Petersen

parent
3eef38a143
commit
0f20651474
@@ -44,6 +44,13 @@ enum qcom_scm_sec_dev_id {
|
||||
QCOM_SCM_ICE_DEV_ID = 20,
|
||||
};
|
||||
|
||||
enum qcom_scm_ice_cipher {
|
||||
QCOM_SCM_ICE_CIPHER_AES_128_XTS = 0,
|
||||
QCOM_SCM_ICE_CIPHER_AES_128_CBC = 1,
|
||||
QCOM_SCM_ICE_CIPHER_AES_256_XTS = 3,
|
||||
QCOM_SCM_ICE_CIPHER_AES_256_CBC = 4,
|
||||
};
|
||||
|
||||
#define QCOM_SCM_VMID_HLOS 0x3
|
||||
#define QCOM_SCM_VMID_MSS_MSA 0xF
|
||||
#define QCOM_SCM_VMID_WLAN 0x18
|
||||
@@ -88,6 +95,12 @@ extern int qcom_scm_ocmem_lock(enum qcom_scm_ocmem_client id, u32 offset,
|
||||
extern int qcom_scm_ocmem_unlock(enum qcom_scm_ocmem_client id, u32 offset,
|
||||
u32 size);
|
||||
|
||||
extern bool qcom_scm_ice_available(void);
|
||||
extern int qcom_scm_ice_invalidate_key(u32 index);
|
||||
extern int qcom_scm_ice_set_key(u32 index, const u8 *key, u32 key_size,
|
||||
enum qcom_scm_ice_cipher cipher,
|
||||
u32 data_unit_size);
|
||||
|
||||
extern bool qcom_scm_hdcp_available(void);
|
||||
extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
|
||||
u32 *resp);
|
||||
@@ -138,6 +151,12 @@ static inline int qcom_scm_ocmem_lock(enum qcom_scm_ocmem_client id, u32 offset,
|
||||
static inline int qcom_scm_ocmem_unlock(enum qcom_scm_ocmem_client id,
|
||||
u32 offset, u32 size) { return -ENODEV; }
|
||||
|
||||
static inline bool qcom_scm_ice_available(void) { return false; }
|
||||
static inline int qcom_scm_ice_invalidate_key(u32 index) { return -ENODEV; }
|
||||
static inline int qcom_scm_ice_set_key(u32 index, const u8 *key, u32 key_size,
|
||||
enum qcom_scm_ice_cipher cipher,
|
||||
u32 data_unit_size) { return -ENODEV; }
|
||||
|
||||
static inline bool qcom_scm_hdcp_available(void) { return false; }
|
||||
static inline int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
|
||||
u32 *resp) { return -ENODEV; }
|
||||
|
Reference in New Issue
Block a user