ANDROID: mmc: support hardware that takes key directly
Currently when an MMC host driver declares crypto support, the MMC core passes a keyslot and 32-bit DUN down to the driver in each request. This is enough for the "standard" eMMC v5.2 crypto (cqhci-crypto). However some SoCs don't follow this standard. They don't have keyslots but rather take keys directly, and they support longer DUNs. To allow such hardware to be supported, modify the MMC core to pass a pointer to the bio_crypt_ctx along with each request, replacing the crypto_enabled and data_unit_num fields. This way is more flexible. Also update cqhci-crypto accordingly to keep it working. (Not being sent upstream yet because this isn't really useful by itself; it would need support for hardware that needs it to be upstreamed too.) Bug: 180886435 Bug: 182283899 Change-Id: I8faf3135f570ca3f2798cf812b4245a5df5515ba Signed-off-by: Eric Biggers <ebiggers@google.com>
This commit is contained in:
parent
e4636b47ef
commit
6c6fac8f39
3 changed files with 10 additions and 15 deletions
|
|
@ -31,18 +31,11 @@ void mmc_crypto_prepare_req(struct mmc_queue_req *mqrq)
|
|||
struct request *req = mmc_queue_req_to_req(mqrq);
|
||||
struct mmc_request *mrq = &mqrq->brq.mrq;
|
||||
|
||||
if (!req->crypt_keyslot)
|
||||
if (!req->crypt_ctx)
|
||||
return;
|
||||
|
||||
mrq->crypto_enabled = true;
|
||||
mrq->crypto_key_slot = blk_ksm_get_slot_idx(req->crypt_keyslot);
|
||||
|
||||
/*
|
||||
* For now we assume that all MMC drivers set max_dun_bytes_supported=4,
|
||||
* which is the limit for CQHCI crypto. So all DUNs should be 32-bit.
|
||||
*/
|
||||
WARN_ON_ONCE(req->crypt_ctx->bc_dun[0] > U32_MAX);
|
||||
|
||||
mrq->data_unit_num = req->crypt_ctx->bc_dun[0];
|
||||
mrq->crypto_ctx = req->crypt_ctx;
|
||||
if (req->crypt_keyslot)
|
||||
mrq->crypto_key_slot = blk_ksm_get_slot_idx(req->crypt_keyslot);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mmc_crypto_prepare_req);
|
||||
|
|
|
|||
|
|
@ -22,12 +22,15 @@ int cqhci_crypto_init(struct cqhci_host *host);
|
|||
*/
|
||||
static inline u64 cqhci_crypto_prep_task_desc(struct mmc_request *mrq)
|
||||
{
|
||||
if (!mrq->crypto_enabled)
|
||||
if (!mrq->crypto_ctx)
|
||||
return 0;
|
||||
|
||||
/* We set max_dun_bytes_supported=4, so all DUNs should be 32-bit. */
|
||||
WARN_ON_ONCE(mrq->crypto_ctx->bc_dun[0] > U32_MAX);
|
||||
|
||||
return CQHCI_CRYPTO_ENABLE_BIT |
|
||||
CQHCI_CRYPTO_KEYSLOT(mrq->crypto_key_slot) |
|
||||
mrq->data_unit_num;
|
||||
mrq->crypto_ctx->bc_dun[0];
|
||||
}
|
||||
|
||||
#else /* CONFIG_MMC_CRYPTO */
|
||||
|
|
|
|||
|
|
@ -164,9 +164,8 @@ struct mmc_request {
|
|||
int tag;
|
||||
|
||||
#ifdef CONFIG_MMC_CRYPTO
|
||||
bool crypto_enabled;
|
||||
const struct bio_crypt_ctx *crypto_ctx;
|
||||
int crypto_key_slot;
|
||||
u32 data_unit_num;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue